我有两个带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页面中调用这些复选框
答案 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==true
。 chkrow.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");