如何取消选中网格视图模板字段中的复选框?

How to uncheck the checkbox within the grid view template field?

我有两个带有 GridView TemplateField 的复选框。我想在提交后取消选中复选框。我的网格视图

<asp:GridView ID="GridView1" runat="server" HorizontalAlign="Center" DataKeyNames="ShiftID" 
Width="177px" onrowdatabound="GridView1_RowDataBound1">
<Columns>
   <asp:TemplateField>
     <ItemTemplate>
       <asp:CheckBox ID="ChbGrid" runat="server" 
          oncheckedchanged="ChbGrid_CheckedChanged" />
           </ItemTemplate>
           <HeaderTemplate>
            <asp:CheckBox ID="ChbGridHead" runat="server"  AutoPostBack="True" 
          Font-Bold="True" oncheckedchanged="ChbGridHead_CheckedChanged" />
      </HeaderTemplate>
   </asp:TemplateField>
</Columns>
</asp:GridView>

我尝试了下面提到的方法

 public void checkboxclear()
    {
        foreach (GridViewRow row in GridView1.Rows)
        {
            CheckBox chkrow = (CheckBox)row.FindControl("ChbGrid");
            if(chkrow.Checked==true)
            {
                chkrow.Checked = false;//it works 
            }
            else 
            {
                CheckBox chkrow1 = (CheckBox)row.FindControl("ChbGridHead");
                if (chkrow1.Checked == true)
                {
                    chkrow1.Checked = false;//it shows error like "Object reference not set to instance of an object"
                }
            }  
        }  

如何改进我的代码来解决这个问题?为什么我无法在 aspx.cs 页面

中调用这些复选框

您需要检查 RowType,因为您的第二个复选框在 HeaderTemplate 中。为此 gridview 生成特殊的 HeaderRow。您可以直接访问并为其设置值。

public void checkboxclear()
    {
        foreach (GridViewRow row in GridView1.Rows)
        {
            if(row.RowType == DataControlRowType.DataRow)
            {
               CheckBox chkrow = (CheckBox)row.FindControl("ChbGrid");
               if(chkrow.Checked)
                chkrow.Checked = false;
            }
        }  
      CheckBox chkrow1 = (CheckBox)GridView1.HeaderRow.FindControl("ChbGridHead");
       if (chkrow1.Checked)
            chkrow1.Checked = false;
    } 

另外你不需要使用chkrow.Checked==truechkrow.Checked 它 returns boolean 值所以直接应该检查 if 条件。

我想我不知道你什么时候调用这个函数,但是 pre-set 值的正确位置是在行数据绑定事件中。

话虽如此,您的代码崩溃的原因是您要在每一行中寻找 header 复选框,而它仅在 header 行中。只需通过网格视图 header 属性 访问 header 并在那里进行查找控制。

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.headerrow(v=vs.110).aspx

类似于

    CheckBox chkHeader = (CheckBox)Gridview1.HeaderRow.FindControl("ChbGridHead");