正如问题所说,当检查标题中的“全选”复选框时,我已经可以检查gridview行中的复选框,当取消选中标题中的“全选”复选框时,取消选中gridview行中的复选框。当我没有检查行中的所有复选框时,我想要这样做,然后不检查标题中的“全选”复选框,反之亦然(当检查行中的所有复选框时,则选择“选择”)检查标题中的所有“CheckBox”。
我该怎么做?
我已经想要实现,但标题中的复选框开始影响(选中或取消选中),即使我只检查或取消选中行中的单个复选框,而不是全部。
以下是我正在使用的代码:
protected void checkAll_CheckedChanged(object sender, EventArgs e)
{
CheckBox ChkBoxHeader = (CheckBox)GridView1.HeaderRow.FindControl("checkAll");
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox ChkBoxRows = (CheckBox)row.FindControl("chkbx_select");
if (ChkBoxHeader.Checked)
{
ChkBoxRows.Checked = true;
}
else
{
ChkBoxRows.Checked = false;
}
}
}
protected void chkbx_select_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkbx_select = (CheckBox)sender;
CheckBox ChkBoxHeader = (CheckBox)GridView1.HeaderRow.FindControl("checkAll");
foreach (GridViewRow row in GridView1.Rows)
{
if (chkbx_select.Checked)
{
ChkBoxHeader.Checked = true;
}
else
{
ChkBoxHeader.Checked = false;
}
}
}
你的回答非常感谢。
谢谢。
答案 0 :(得分:1)
想法是在每个CheckedChanged事件上迭代所有复选框(在所有行中)并确保检查所有复选框。像这样的东西
protected void chkbx_select_CheckedChanged(object sender, EventArgs e)
{
CheckBox chkbx_select = (CheckBox)sender;
CheckBox ChkBoxHeader = (CheckBox)GridView1.HeaderRow.FindControl("checkAll");
if(!chkbx_select.Checked)
{
// Checkbox was unchecked,
// short circuit, set Select All Checkbox.Checked = false and return
ChkBoxHeader.Checked = false;
return;
}
bool allChecked = true;
foreach (GridViewRow row in GridView1.Rows)
{
// this is pseudocode, find checkbox on each row
var checkBox = row.FindControl("Checkbox")
if (!checkbox.Checked)
{
allChecked = false;
break;
}
}
ChkBoxHeader.Checked = allChecked;
}