首先在Page_Load中
if(!IsPostBack)
绑定DataGrid然后:
private void gridRightList_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
int iIndex = e.Item.ItemIndex;
if(iIndex > -1)
{
for(int i = 1 ; i < e.Item.Cells.Count ; i++)
{
CheckBox chk = new CheckBox();
chk.ID = "chk" + iIndex + "_" + i;
e.Item.Cells[i].Controls.Add(chk);
}
}
}
if(!IsPostBack)
绑定DataGrid然后:
private void gridRightList_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
int iIndex = e.Item.ItemIndex;
if(iIndex > -1)
{
for(int i = 1 ; i < e.Item.Cells.Count ; i++)
{
CheckBox chk = new CheckBox();
chk.ID = "chk" + iIndex + "_" + i;
e.Item.Cells[i].Controls.Add(chk);
}
}
}
是因为,你的checkBox是动态生成的
提交后,属于PostBack
正好被你的(!IsPostBack)否决了
因此,没有执行checkbox动态生成
当然也就找不到
checkbox了你的属性变成什么样了
所有CheckBox空间的ID属性都变了
在page_load中都要动态生成一次CheckBox
if (!Page.IsPostBack)
{
//绑定DataGrid
}2. 在ItemCreated事件和ItemDataBound事件中,都要添加CheckBox控件,代码必须相同。
原因:在执行DataBound()方法的时候,DataGrid会激发ItemDataBound事件来处理绑定内容,这时候会取消ItemCreated里建立的控件。在页面返回的时候,页面会执行ItemCreated事件,重新建立CheckBox。所以,ItemDataBound中的代码是为DataBind()方法使用的,ItemCreated中的代码是在页面方法的时候使用的。
这样添加的控件在页面刷新后仍然可以保存控件状态。
这样就不用每次都判断重新生成了我做过的代码如下:
实现的是,如果数据库里netAccountInTime字段为空,就显示CheckBox;否则,就用lable显示其值
<asp:TemplateColumn HeaderText="录入">
<ItemTemplate>
<asp:Label id=netAccountIn_label Runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"netAccountInTime") %>'></asp:Label>
<asp:CheckBox id=netAccountIn_check Runat="server" Visible='<%# (bool)(DataBinder.Eval(Container, "DataItem.netAccountInTime") == System.DBNull.Value) %>'></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
但是如果像你所说的那样,在在ItemCreated事件和ItemDataBound事件中,都要添加CheckBox控件,代码相同。虽然可以保证页面上的CheckBox控件不丢失,但是这两次事件之间的用户对该控件的操作就保存不下来了。
比如说我在页面上选中该CheckBox后提交,页面上实际上是又重新生成了一次CheckBox,但是用户的选中值就丢失了呀
有什么方法可以使这些动态生成的控件状态完全重现呢?
每个CheckBox都要取唯一ID
若CheckBox不是第一次生成
只要取上次的同一ID,
Page类会自动加载上次数据