C# 选中/取消选中所有复选框

C# 选中/取消选中所有复选框,c#,asp.net,checkbox,checkboxlist,C#,Asp.net,Checkbox,Checkboxlist,我有一个复选框列表,它从sql表中获取项目,并根据从下拉菜单中选择的内容进行更改。我正在尝试在该列表中添加另一个复选框,该复选框充当“全部选择/全部取消选择”框。我在这个网站上看到了一些例子,但似乎没有什么是完全正确的 预期功能:选择框后,将选择所有其他框 取消选择框时,将选择所有其他框 选择框后,如果取消选择另一个框,则取消选择“全部选择”框 C: ASP: 听起来你明白你的问题。当您单击除第一个复选框以外的任何其他复选框时,就会出现问题。如果第一个复选框未选中,而您选中了另一个复选框,则您的

我有一个复选框列表,它从sql表中获取项目,并根据从下拉菜单中选择的内容进行更改。我正在尝试在该列表中添加另一个复选框,该复选框充当“全部选择/全部取消选择”框。我在这个网站上看到了一些例子,但似乎没有什么是完全正确的

预期功能:选择框后,将选择所有其他框

取消选择框时,将选择所有其他框

选择框后,如果取消选择另一个框,则取消选择“全部选择”框

C:

ASP:


听起来你明白你的问题。当您单击除第一个复选框以外的任何其他复选框时,就会出现问题。如果第一个复选框未选中,而您选中了另一个复选框,则您的逻辑告诉所有其他复选框不要选中,包括刚才选中的复选框

一个选项是从复选框列表中删除“全部选择/取消选择”复选框。让它成为自己的独立复选框

<asp:CheckBox ID="chkAll" runat="server" Text="Select/Deselect All" OnCheckedChanged="chkAll_CheckedChanged" AutoPostBack="true" />
<anthem:CheckBoxList ID="checkOpenTimesheets" OnSelectedIndexChanged="checkOpenTimesheets_SelectedIndexChanged" runat="server" AutoPostBack="true" >
</anthem:CheckBoxList>
然后,还可以使用内置功能,通过编程选择或取消选择复选框列表中的“全部选择/全部取消选择”复选框(如果复选框列表中有任何复选框)更改为其他复选框以外的复选框。如中所述,这里的关键是关闭全选复选框的CheckedChanged事件,否则该事件将触发,如您所见

protected void checkOpenTimesheets_SelectedIndexChanged(object sender, EventArgs e)
{
    chkAll.CheckedChanged -= chkAll_CheckedChanged;

    CheckBoxList checkOpenTimesheets = (CheckBoxList)sender;
    if (allItemsCheckedInCheckBoxList(checkOpenTimesheets))
    {
        chkAll.Checked = true;
    }
    else if (allItemsUnCheckedInCheckBoxList(checkOpenTimesheets))
    {
        chkAll.Checked = false;
    }

    chkAll.CheckedChanged += chkAll_CheckedChanged;
}

private bool allItemsCheckedInCheckBoxList(CheckBoxList checkBoxList)
{
    bool allItemsChecked = true;

    foreach (ListItem item in checkBoxList.Items)
    {
        allItemsChecked = item.Selected;

        if (!allItemsChecked)
            break;
    }

    return allItemsChecked;
}

private bool allItemsUnCheckedInCheckBoxList(CheckBoxList checkBoxList)
{
    bool allItemsUnChecked = false;

    foreach (ListItem item in checkBoxList.Items)
    {
        allItemsUnChecked = item.Selected;

        if (allItemsUnChecked)
            break;
    }

    return allItemsUnChecked;
}

什么不起作用?是否添加选择/取消选择所有项目?或者实际执行其他项目的选择和取消选择?更新了代码,并尝试选择/取消选择。我在asp代码中添加了选择/取消选择项。它可能是事件序列。您可能正在选中/取消选中所有内容,但随后将重建列表。在任何情况下,您可能想考虑在客户端用JavaScript /jQuery来做这件事。这将更加用户友好,速度更快。是否仍有办法使onselectedIndexChanged事件仅应用于第一个复选框,即“全选”复选框??这似乎就是问题所在。好吧,我照你说的做了,并把它作为一个单独的复选框。选中/取消选中其他复选框时,选中/取消选中“全选”复选框时卡住。我输入代码来比较选中的项目和全选复选框,然后选中/取消选中全选复选框。但当这种情况发生时,它会调用chkAll_CheckedChanged方法并选择/取消选择所有这些方法。@pfferno-Check out。我想这就是你需要的。试着在这个链接上实现第二个答案。但是似乎没有正确的答案,我用全选复选框和复选框列表的两种方法更新了答案。嗯,在checkedchanged事件的aspx代码中调用了哪种方法?allItemsChecked或allItemsUnchecked?这两种方法都是简单的辅助方法。它们不是事件本身。chkAll_CheckedChanged和checkeOpenTimesheets_SelectedIndexChanged是调用的两个事件。
<anthem:CheckBoxList ID="CheckOpenTimesheets" OnSelectedIndexChanged="select_DeselectAll" runat="server" AutoPostBack="true" >
    <asp:ListItem Text="Select/Deselect All"  />
</anthem:CheckBoxList>
protected void chkAll_CheckedChanged(object sender, EventArgs e)
{
    foreach (ListItem item in CheckOpenTimesheets.Items)
    {
        item.Selected = chkAll.Checked;
    }
}

protected void checkbox_Selected(object sender, EventArgs e)
{
    chkAll.CheckedChanged -= chkAll_CheckedChanged;

        foreach (ListItem item in CheckOpenTimesheets.Items)
        {
            if ((item.Selected = false) && (chkAll.Checked = true))
            {
                chkAll.Checked = false;
            }
        }       
}
<asp:CheckBox ID="chkAll" runat="server" Text="Select/Deselect All" OnCheckedChanged="chkAll_CheckedChanged" AutoPostBack="true" />
<anthem:CheckBoxList ID="checkOpenTimesheets" OnSelectedIndexChanged="checkOpenTimesheets_SelectedIndexChanged" runat="server" AutoPostBack="true" >
</anthem:CheckBoxList>
protected void chkAll_CheckedChanged(object sender, EventArgs e)
{
    foreach(ListItem item in CheckOpenTimesheets.Items)
    {
        item.Selected = chkAll.Checked;
    }
}
protected void checkOpenTimesheets_SelectedIndexChanged(object sender, EventArgs e)
{
    chkAll.CheckedChanged -= chkAll_CheckedChanged;

    CheckBoxList checkOpenTimesheets = (CheckBoxList)sender;
    if (allItemsCheckedInCheckBoxList(checkOpenTimesheets))
    {
        chkAll.Checked = true;
    }
    else if (allItemsUnCheckedInCheckBoxList(checkOpenTimesheets))
    {
        chkAll.Checked = false;
    }

    chkAll.CheckedChanged += chkAll_CheckedChanged;
}

private bool allItemsCheckedInCheckBoxList(CheckBoxList checkBoxList)
{
    bool allItemsChecked = true;

    foreach (ListItem item in checkBoxList.Items)
    {
        allItemsChecked = item.Selected;

        if (!allItemsChecked)
            break;
    }

    return allItemsChecked;
}

private bool allItemsUnCheckedInCheckBoxList(CheckBoxList checkBoxList)
{
    bool allItemsUnChecked = false;

    foreach (ListItem item in checkBoxList.Items)
    {
        allItemsUnChecked = item.Selected;

        if (allItemsUnChecked)
            break;
    }

    return allItemsUnChecked;
}