如果未选中gridview行中的所有复选框,则取消选中复选框标题

时间:2015-09-23 09:17:06

标签: c# asp.net gridview checkbox

正如问题所说,当检查标题中的“全选”复选框时,我已经可以检查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;
            }
        }
    }

你的回答非常感谢。

谢谢。

1 个答案:

答案 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;
  }