Asp.net 在网格中始终将复选框设置为false

Asp.net 在网格中始终将复选框设置为false,asp.net,gridview,checkbox,Asp.net,Gridview,Checkbox,我在网格中有复选框。我试图从codebehind访问它们,并获取选中/未选中行的数据。但即使选中复选框,我也会将它们作为checked属性获取,仅作为false: Aspx: 我没有发现问题。我也正确地对控件进行了设计。我假设您总是对GridView进行数据绑定,而不仅仅是如果(!Page.IsPostBack)… 所以把它放到page\u load protected void Page_Load(object sender, EventArgs e) {

我在网格中有复选框。我试图从codebehind访问它们,并获取选中/未选中行的数据。但即使选中复选框,我也会将它们作为checked属性获取,仅作为false:

Aspx:


我没有发现问题。我也正确地对控件进行了设计。

我假设您总是对GridView进行数据绑定,而不仅仅是
如果(!Page.IsPostBack)…

所以把它放到
page\u load

protected void Page_Load(object sender, EventArgs e)
{                        
    if(!Page.IsPostBack)
    {
        DataBindControls(); // like GridView etc.
    }
}

如果使用
DataBind
控件,它们将丢失更改和视图状态。即使是事件也不会触发。因此,只有在第一次加载时才应该这样做。

下面是一个在gridview中填充复选框并通过单击按钮获取值的简单示例

Default.aspx

<asp:GridView ID="gv" 
              runat="server" 
              AutoGenerateColumns="false" 
              OnRowDataBound="gv_RowDataBound">
  <Columns>
    <asp:TemplateField>
      <ItemTemplate>
        <asp:CheckBox ID="chkReq" runat="server" />
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>
</asp:GridView>
<br />
<asp:Button ID="btnSubmit" 
            runat="server" 
            OnClick="btnSubmit_Click" 
            Text="Submit" />


Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    //Create 20 rows
    gv.DataSource = Enumerable.Range(1, 20);
    gv.DataBind();
  }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
  var isCheckedList = new List<bool>();

  for(var index = 0; index < gv.Rows.Count; ++index)
  {
    var chkReq = (CheckBox)gv.Rows[index].FindControl("chkReq");
    isCheckedList.Add(chkReq.Checked);
  }

  //Look at isCheckedList to get a list of current values.
  System.Diagnostics.Debugger.Break();
}

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    var index = e.Row.RowIndex;

    //Strongly Bind Controls
    var chkReq = (CheckBox)e.Row.FindControl("chkReq");
    chkReq.Text = "Item " + index.ToString();
  }
}
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!IsPostBack)
{
//创建20行
gv.DataSource=可枚举范围(1,20);
gv.DataBind();
}
}
受保护的void btnsupmit\u单击(对象发送者,事件参数e)
{
var isCheckedList=新列表();
对于(变量索引=0;索引

因为您没有显示所有代码,所以可能是Tim Schmelter所说的问题,也可能是其他问题。此示例为您提供了从网格视图检索复选框值所需的基本知识。

Oh yes..我在页面加载和回发检查中调用了它..我现在得到了真实值。谢谢..让我继续,看看功能是否正常..谢谢,汉克斯,完全忘记了这一点。。。当你尝试获取它们时,你帮我节省了数小时的调试时间?参加什么活动?
<asp:GridView ID="gv" 
              runat="server" 
              AutoGenerateColumns="false" 
              OnRowDataBound="gv_RowDataBound">
  <Columns>
    <asp:TemplateField>
      <ItemTemplate>
        <asp:CheckBox ID="chkReq" runat="server" />
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>
</asp:GridView>
<br />
<asp:Button ID="btnSubmit" 
            runat="server" 
            OnClick="btnSubmit_Click" 
            Text="Submit" />
protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    //Create 20 rows
    gv.DataSource = Enumerable.Range(1, 20);
    gv.DataBind();
  }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
  var isCheckedList = new List<bool>();

  for(var index = 0; index < gv.Rows.Count; ++index)
  {
    var chkReq = (CheckBox)gv.Rows[index].FindControl("chkReq");
    isCheckedList.Add(chkReq.Checked);
  }

  //Look at isCheckedList to get a list of current values.
  System.Diagnostics.Debugger.Break();
}

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    var index = e.Row.RowIndex;

    //Strongly Bind Controls
    var chkReq = (CheckBox)e.Row.FindControl("chkReq");
    chkReq.Text = "Item " + index.ToString();
  }
}