您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



DataList编辑模式下DropDownList等控件的数据初始化
狼子 发表于 2005-6-21 20:05:00 阅读全文 | 回复(0) | 引用通告 | 编辑

DataList控件可以利用在EditItemTemplate中设置来处理对数据的编译,比如说在<EditItemTemplate>中,设置:

任职情况:<asp:textbox id=Appointment runat="server" CssClass="labelna" Text='<%# DataBinder.Eval(Container.DataItem,"appointment") %>'>
</asp:textbox>

是否在校:<asp:CheckBox id=Isworking runat="server" Checked='<%# Convert.ToBoolean(DataBinder.Eval(Container.DataItem,"isworking")) %>'>
</asp:CheckBox>

然后在EditCommand事件里设置DataList1.EditItemIndex=e.Item.ItemIndex;后,再对DataList1重新DataBind(),就可以进入该记录的编辑状态了,初始数据也可以由DataBinder自动处理。

但是如果在EditItemTemplate中,使用了DropDownList控件的时候呢,情况就复杂一点点了,因为DropDownList控件没可以直接初始化数据,要在程序中用代码处理,可是EditCommand事件发生的时候,EditItemTemplate里的控件都还没生成,FindControl取到的值,全都是null值。

所以DropDownList控件的初始化要放在ItemDataBound事件中,思路很简单:

1、在EditItemTemplate中,加入DropDownList的同时,加入一个TextBox,用于绑定数据库中的数据

2、在ItemDataBound中,从TextBox中读取数据库中的数据,再在DropDownList的Item中设置Selected属性。

以下用我程序中的例子举例:

例子一,DropDownList的Item是固定的,定义:
经历类型:<asp:dropdownlist id="Etype" runat="server">
<asp:ListItem Value="学习">学习</asp:ListItem>
<asp:ListItem Value="培训">培训</asp:ListItem>
<asp:ListItem Value="工作">工作</asp:ListItem>
</asp:dropdownlist>
<asp:TextBox id=txtEtype runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"etype") %>' CssClass="hiddeninput">
</asp:TextBox>

绑定:
MyDropDownList=(DropDownList)e.Item.FindControl("Etype");
MyTextBox=(TextBox)e.Item.FindControl("txtEtype");
nnll.DropDownList_Fix_Bind(MyDropDownList,MyTextBox);

其中DropDownList_Fix_Bind方法,是我定义在NNLL.cs中的一个方法:
public void DropDownList_Fix_Bind(DropDownList MyDropDownList,TextBox MyTextBox)
  {
   //DataList里的DropDownList控件中固定项在编辑模式下的数据初始化
   if(MyDropDownList!=null && MyTextBox!=null)
   {
    MyDropDownList.Items.FindByValue(MyTextBox.Text.Trim()).Selected=true;
   }
  }

例子二,DropDownList的Item是在程序中根据数据库中的表检索添加的,定义:
<asp:dropdownlist id="D_hlid" runat="server" CssClass="labelna"></asp:dropdownlist>
<asp:TextBox id=txtD_hlid runat="server" CssClass="labelna" Text='<%# DataBinder.Eval(Container.DataItem,"d_hlid") %>'>
</asp:TextBox>

绑定:
MyDropDownList=(DropDownList)e.Item.FindControl("D_hlid");
MyTextBox=(TextBox)e.Item.FindControl("txtD_hlid");
nnll.DropDownList_Active_Bind(this,MyConnection,MyDropDownList,MyTextBox,"award_level");

其中DropDownList_Active_Bind方法,是我定义在NNLL.cs中的一个方法:
public void DropDownList_Active_Bind(System.Web.UI.Page aPage,SqlConnection MyConnection,DropDownList MyDropDownList,TextBox MyTextBox,string MyType)
  {
   //DataList里的DropDownList控件中字典表在编辑模式下的数据初始化
   //检索数据
   d_Retrieve(aPage,MyConnection,MyDropDownList,MyType);
   string txt;
   txt=MyTextBox.Text.Trim();
   //检测有没有记录的值,如果没有,就是被禁用的,要添加上
   if(!MyDropDownList.Items.Contains(MyDropDownList.Items.FindByValue(txt)))
   {
    //禁用的,加上
    MyDropDownList.Items.Add(new ListItem("已经禁用项",txt));
   }
   //设置初始值
   MyDropDownList.SelectedValue=txt;
  }

d_Retrieve方法也是定义在NNLL.cs上的方法,用于从字典表中检索可用项添加在DrowDownList的Item中:
public void d_Retrieve(System.Web.UI.Page aPage,SqlConnection MyConnection,DropDownList MyDropDownList,string rtype)
  {
   string mysql="",myna="",myid="";
   switch(rtype)
   {
    case "award_level":
     mysql="select * from d_hortatior_level where d_hlisdel=0";
     myna="d_hlna";
     myid="d_hlid";
     break;
    default:
     //出错信息
     aPage.Response.Redirect("../include/mes.aspx?mes=参数出错");
     break;
   }
   SqlCommand MyCommand=new SqlCommand(mysql,MyConnection);
   SqlDataReader dr=MyCommand.ExecuteReader();
   if(MyDropDownList!=null)
   {
    while(dr.Read())
    {
     MyDropDownList.Items.Add(new ListItem(dr[myna].ToString(),dr[myid].ToString()));
    }
   }
   dr.Close();
  }

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.