简体   繁体   English

在ASP.NET GridView中动态生成CheckBox不会保持状态

[英]Dynamic generation of CheckBox in asp.net gridview does not maintain the state

aspx code aspx代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="TestButton" runat="server" OnClick="TestButton_Click"
            Text="AddNewRow" />
    </div>
    <div>
        <asp:GridView ID="MyGrid" runat="server" GridLines="Both"
            AutoGenerateColumns="false" OnDataBound="MyGrid_DataBound"
            EnableViewState="true">
            <Columns>
                <asp:BoundField DataField="Name" HeaderText="name" />
                <asp:TemplateField HeaderText="CheckBox1">
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox1" EnableViewState="true"
                           runat="server" AutoPostBack="true" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="CheckBox2">
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox2" runat="server"
                           EnableViewState="true" AutoPostBack="true" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="CheckBox3">
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox3" runat="server"
                           AutoPostBack="true" EnableViewState="true" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>
    </form>
</body>
</html>

Code behind 后面的代码

public DataTable Dt = new DataTable();
protected void Page_Load(object sender, EventArgs e) { }
protected void TestButton_Click(object sender, EventArgs e)
{
   DataRow dr = null;
   if(ViewState["T"]==null)
   {
      Dt.Columns.Add(new DataColumn("Name", typeof(string)));
      Dt.Columns.Add(new DataColumn("CheckBox1", typeof(bool)));
      Dt.Columns.Add(new DataColumn("CheckBox2", typeof(bool)));
      Dt.Columns.Add(new DataColumn("CheckBox3", typeof(bool)));
      ViewState["T"] = Dt;
    }
    Dt =(DataTable) ViewState["T"];
    dr = Dt.NewRow();
    dr["Name"] = "Sam";
    dr["CheckBox1"] = true;
    dr["CheckBox2"] = false;
    dr["CheckBox3"] = false;
    Dt.Rows.Add(dr);
    SearchGrid.DataSource = Dt;
    SearchGrid.DataBind();
 }
 protected void MyGrid_DataBound(object sender, EventArgs e)
 {
    (SearchGrid.Rows[SearchGrid.Rows.Count - 1].Cells[1].FindControl("CheckBox1")
                as CheckBox).Checked = true;
  }
}

when i click the the Addnew row button the result would be some thing like this 当我单击“添加新行”按钮时,结果将是这样的

在此处输入图片说明

but when i click again 但是当我再次点击

在此处输入图片说明

the first row check box gets uncheckd. 第一行复选框未选中。 i have enabled the view state for each checkbox but still it does not work. 我已经为每个复选框启用了视图状态,但仍然无法正常工作。 is tehre some thing i should do with the data table which i am binding? 这是我应该对要绑定的数据表执行的某些操作吗?

Your ViewState is perfectly fine. 您的ViewState非常好。 It must be storing the data you want to persist. 它必须存储要保留的数据。

You haven't bound your gridView Columns to any field, in this case the DataColumn names of your DataTable. 您尚未将gridView Columns绑定到任何字段,在本例中为DataTable的DataColumn名称。 Bind your checkboxes like this: 像这样绑定您的复选框:

<asp:CheckBox ID="CheckBoxX" runat="sever" 
           Checked ='<%# Eval("DataFieldName") %>' />

ie

<asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Eval("CheckBox1") %>' 
      AutoPostBack="true" EnableViewState="true" />

<asp:CheckBox ID="CheckBox2" runat="server" Checked='<%# Eval("CheckBox2") %>' 
  AutoPostBack="true" EnableViewState="true" />

<asp:CheckBox ID="CheckBox3" runat="server" Checked='<%# Eval("CheckBox3") %>' 
  AutoPostBack="true" EnableViewState="true" />

since CheckBox1, CheckBox2, CheckBox3 are the field(column) names of the DataSource assigned to the SearchGrid(GridView) 因为CheckBox1,CheckBox2,CheckBox3是分配给SearchGrid(GridView)DataSource的字段(列)名称

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM