Select/Deselect 所有复选框
Select/Deselect All checkbox
我有一个复选框列表,它从 sql table 中获取其项目,并根据下拉菜单中 select 编辑的内容进行更改。我正在尝试在该列表中添加另一个复选框,它充当 select/deselect 全部框。我在这个网站上看到了一些例子,但似乎没有什么是正确的。
预期功能:当框被 selected 时,所有其他框都被 selected。
当框未被select编辑时,所有其他框都被select编辑。
当框被 selected 时,如果另一个框随后被取消selected,则 select 所有框都被取消selected。
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();
我为 selection/deselection 所做的尝试:
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;
}
}
}
ASP:
<anthem:CheckBoxList ID="CheckOpenTimesheets" OnSelectedIndexChanged="select_DeselectAll" runat="server" AutoPostBack="true" >
<asp:ListItem Text="Select/Deselect All" />
</anthem:CheckBoxList>
编辑:问题似乎是 OnSelectedIndexChanged 事件触发时 select 以外的复选框都是 selected。
Edit2:将 select 所有复选框与复选框列表分开。但是,当尝试实现以下功能时,如果在选中 select all 复选框时未selected 复选框,则 select all 复选框将被取消selected 但是所有其他人都没有 "deselect"。但这并没有发生,因为 select 所有复选框事件都会触发。
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;
}
}
}
听起来你明白你的问题了。当您单击第一个复选框以外的任何其他复选框时,就会出现问题。如果第一个未选中而您选中另一个复选框,则您的逻辑告诉 所有 其他复选框不被选中,包括您刚刚选中的复选框。
一种选择是从 CheckBoxList 中删除 "Select/Deselect All" 复选框。让它成为自己独立的复选框。
<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>
那么您的 select 所有事件处理程序都会将它们全部更改为相同。
protected void chkAll_CheckedChanged(object sender, EventArgs e)
{
foreach(ListItem item in CheckOpenTimesheets.Items)
{
item.Selected = chkAll.Checked;
}
}
然后还构建功能,如果 CheckBoxList 中的任何复选框更改为不同于所有其他复选框的内容,您可以通过编程 select 或取消 select "Select/Deselect All" 复选框。如 this answer 中所述,这里的关键是关闭 select 所有复选框的 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;
}
我有一个复选框列表,它从 sql table 中获取其项目,并根据下拉菜单中 select 编辑的内容进行更改。我正在尝试在该列表中添加另一个复选框,它充当 select/deselect 全部框。我在这个网站上看到了一些例子,但似乎没有什么是正确的。
预期功能:当框被 selected 时,所有其他框都被 selected。
当框未被select编辑时,所有其他框都被select编辑。
当框被 selected 时,如果另一个框随后被取消selected,则 select 所有框都被取消selected。
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();
我为 selection/deselection 所做的尝试:
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;
}
}
}
ASP:
<anthem:CheckBoxList ID="CheckOpenTimesheets" OnSelectedIndexChanged="select_DeselectAll" runat="server" AutoPostBack="true" >
<asp:ListItem Text="Select/Deselect All" />
</anthem:CheckBoxList>
编辑:问题似乎是 OnSelectedIndexChanged 事件触发时 select 以外的复选框都是 selected。
Edit2:将 select 所有复选框与复选框列表分开。但是,当尝试实现以下功能时,如果在选中 select all 复选框时未selected 复选框,则 select all 复选框将被取消selected 但是所有其他人都没有 "deselect"。但这并没有发生,因为 select 所有复选框事件都会触发。
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;
}
}
}
听起来你明白你的问题了。当您单击第一个复选框以外的任何其他复选框时,就会出现问题。如果第一个未选中而您选中另一个复选框,则您的逻辑告诉 所有 其他复选框不被选中,包括您刚刚选中的复选框。
一种选择是从 CheckBoxList 中删除 "Select/Deselect All" 复选框。让它成为自己独立的复选框。
<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>
那么您的 select 所有事件处理程序都会将它们全部更改为相同。
protected void chkAll_CheckedChanged(object sender, EventArgs e)
{
foreach(ListItem item in CheckOpenTimesheets.Items)
{
item.Selected = chkAll.Checked;
}
}
然后还构建功能,如果 CheckBoxList 中的任何复选框更改为不同于所有其他复选框的内容,您可以通过编程 select 或取消 select "Select/Deselect All" 复选框。如 this answer 中所述,这里的关键是关闭 select 所有复选框的 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;
}