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();
}