如何取消选中网格视图模板字段中的复选框?
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==true
。 chkrow.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");
我有两个带有 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==true
。 chkrow.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");