程序开发 > C# > 正文

GridView中的CheckBox取不到值的原因及解决办法

亮术网 2020-09-02 本网原创

在使用 GridView 过程中,稍有不留意可能会导致 GridView 中的 CheckBox 取不到值,如果不明白原因,可能一个小问题也要折腾半天。

 

GridView中的 CheckBox 取不到值的示例

前台代码:

<asp:GridView ID="gvProduct" runat="server" AutoGenerateColumns="False" AllowPaging="false" CellPadding="0" CellSpacing="0">
    <FooterStyle BackColor="White" ForeColor="#0cc" />
    <Columns>
    <asp:TemplateField>
      <ItemStyle CssClass="textc" />
      <ItemTemplate><asp:CheckBox ID="cb" runat="server" /></ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="id" Visible="false" HeaderText="ID" />
    <asp:HyperLinkField HeaderText="产品名称" DataNavigateUrlFields="id" DataNavigateUrlFormatString="addProduct.aspx?id={0}" DataTextField="Name" DataTextFormatString ="{0}" />
    <
asp:BoundField DataField="price" HeaderText="价格" />
    <
asp:BoundField DataField="BrowseNum" HeaderText="浏览次数" />
    </
Columns>
    <
HeaderStyle ForeColor="#000" CssClass="gvHeader" />
  </asp:GridView>
  <div><asp:Button ID="btnDelete" runat="server" Text=" 删 除 " OnClick="btnDelete_Click" /></div>

 

后台代码:

protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
      BindData();
  }

private void BindData)
  {
  }

protected void btnDelete_Click(object sender, EventArgs e)
  {
    for (int i = 0; i < gvProduct.Rows.Count; i++)
    {
      CheckBox cb = (CheckBox)gvCommon.Rows[i].FindControl("cb");
      if (cb.Checked == true)
      {
      }
    }
  }

如果把 BindData(); 不放在  if (!IsPostBack) 里面,在 btnDelete_Click(object sender, EventArgs e) 中将取不到 CheckBox 的值。

原因是:当单击删除时,又执行了一次 BindData(),导致 GridView 被重新绑定,从而变了 CheckBox 的状态,所以出现本来 CheckBox是选中了的,结果没选中。所以一定要把 BindData() 放到 if (!IsPostBack) 里。