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

时间:2015-02-26 11:10:48

标签: c# asp.net gridview checkbox

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

<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页面中调用这些复选框

2 个答案:

答案 0 :(得分:1)

您需要检查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它返回boolean值,以便可以检查if条件。

答案 1 :(得分:1)

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

已经说过你的代码爆炸的原因是你正在寻找每一行中的标题复选框,它只在标题行中。只需通过gridviews标题属性访问标题,然后在那里进行查找控件。

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

这样的东西
    CheckBox chkHeader = (CheckBox)Gridview1.HeaderRow.FindControl("ChbGridHead");