【问题标题】:Select/Deselect All checkbox全选/取消全选复选框
【发布时间】:2016-02-20 09:25:45
【问题描述】:

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

预期功能:选择框时,会选择所有其他框。

当框未选中时,所有其他框都被选中。

当框被选中时,如果另一个框被取消选中,则全选框被取消选中。

C#:

List<ListItem> toBeRemoved = new List<ListItem>();

//removes items when new item from dropdown is selected
for (int i = 1; i < CheckOpenTimesheets.Items.Count; i++)
{
    toBeRemoved.Add(CheckOpenTimesheets.Items[i]);
}
for (int i = 0; i < toBeRemoved.Count; i++)
{
    CheckOpenTimesheets.Items.Remove(toBeRemoved[i]);
}
lblOpenTimesheets.Text = "";
String sql = "sql statement here";
command.CommandText = sql;
command.Parameters.Add(new SqlParameter("userid", ddlActingAs.SelectedValue.ToString()));

SqlDataReader reader = command.ExecuteReader();

//Adds items to the checkboxlist
while (reader.Read())
{
    ListItem item = new ListItem();
    item.Text += reader.GetDateTime(0).ToString("MM/dd/yyyy") + " is open";
    item.Value = reader["StartDate"].ToString();

    CheckOpenTimesheets.Items.Add(item);
}
CheckOpenTimesheets.UpdateAfterCallBack = true;
reader.Close();

我为选择/取消选择所做的尝试:

protected void select_DeselectAll(object sender, System.EventArgs e)
{
    if (CheckOpenTimesheets.Items[0].Selected == true)
    {
        foreach (ListItem item in CheckOpenTimesheets.Items)
        {
            item.Selected = true;
        }
    }
    else
    {
        foreach (ListItem item in CheckOpenTimesheets.Items)
        {
            item.Selected = false;
        }
    }
}

平均售价:

<anthem:CheckBoxList ID="CheckOpenTimesheets" OnSelectedIndexChanged="select_DeselectAll" runat="server" AutoPostBack="true" >
    <asp:ListItem Text="Select/Deselect All"  />
</anthem:CheckBoxList>

Edit: The problem seems to be the OnSelectedIndexChanged event firing when the checkboxes other than the select all one is selected.

Edit2:使全选复选框与复选框列表分开。但是,当尝试实现一个功能时,如果在选中全选复选框时未选中一个复选框,则全选复选框将被取消选中,但所有其他复选框都不会“取消选择”。但是这并没有发生,因为全选复选框事件触发了。

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 代码中添加了选择/取消选择项。
  • 这可能是事件的顺序。您可能正在检查/取消选中所有内容,然后重新构建列表。无论如何,您可能需要考虑在客户端使用 JavaScript/Jquery 执行此操作。它会更加用户友好和更快。
  • 有没有办法让 onselectedIndexChanged 事件只适用于第一个复选框,也就是全选?这似乎是问题所在。

标签: c# asp.net checkbox checkboxlist


【解决方案1】:

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

一种选择是将“全选/取消全选”复选框从 CheckBoxList 中取出。让它成为它自己的独立复选框。

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

然后,如果 CheckBoxList 中的任何内容更改为其他所有内容以外的内容,则还可以在其中以编程方式选择或取消选择“全选/取消全选”复选框。正如this answer 中所解释的,这里的关键是关闭全选复选框的 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;
}

【讨论】:

  • 好的,我照你说的做了,并把它做成了一个单独的复选框。当其他人被检查/取消选中时,粘在选择/取消选择完所有复选框。我输入了代码来比较选中的项目和全选复选框,然后选中/取消选中全选复选框。但是当这种情况发生时,它会调用 chkAll_CheckedChanged 方法并选择/取消选择所有这些。
  • @pfinferno - 查看this answer。我认为这就是你所需要的。
  • 尝试在该链接stackoverflow.com/a/8089153/2480598 上实现第二个答案。但似乎无法正确,我用两种方法更新了我的答案(对于全选复选框和复选框列表)。
  • 嗯,在 checkedchanged 事件的 aspx 代码中调用了哪个方法? allItemsChecked 还是 allItemsUnchecked?
  • 这两个只是辅助方法。它们不是事件本身。 chkAll_CheckedChangedcheckOpenTimesheets_SelectedIndexChanged 是被调用的两个事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2011-09-09
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多