复选框,用于(取消)选中所有其他复选框
本文关键字:复选框 其他 用于 取消 | 更新日期: 2023-09-27 17:58:27
我创建了一个窗口窗体,(到目前为止)只包含复选框。构造函数接受一个参数:string[] attributes
。对于这个attributes
数组中的每个字符串,我都会创建一个复选框。
例如:
string[] attributes = {
"Black",
"Red",
"Blue"
};
form1 = new MyForm(attributes);
form1.Show();
将创建这样的复选框:
[ ] Black
[ ] Red
[ ] Blue
这很好用。现在,我的下一步是创建一个复选框"全选",它具有以下行为。我将使用this
引用我的"全选"复选框。
何时:
- 用户选中
this
:选中所有其他复选框 - 用户取消选中
this
:所有其他复选框都将取消选中 - 所有其他复选框都会被手动选中:
this
也会被选中 - 所有复选框都被选中,其中任何一个都被取消选中:
this
也被取消选中
我成功地完成了上述所有规则,但我遇到了一个问题,我不知道如何解决它:当所有复选框都被选中,而用户取消选中一个复选框时,这意味着我的"全选"复选框也将被取消选中。现在,我的"全选"复选框被取消选中,它会自动调用取消选中事件,然后取消选中所有复选框,就像用户取消选中我的"全检"复选框一样。
那么,当其他复选框调用取消选中时,有没有办法告诉我的复选框不要运行CheckedChanged
?
这是我的代码(都是手写的,所以没有使用视觉工作室设计师):
using System;
using System.Drawing;
using System.Windows.Forms;
class MyForm
{
public MyForm(string[] attributes)
{
SpawnControls(attributes);
}
private CheckBox[] m_attributes;
private CheckBox m_all;
private void SpawnControls(string[] attributes)
{
CheckBox dummy = new CheckBox();
int nAttr = attributes.Length;
m_attributes = new CheckBox[nAttr];
for (int i = 0; i < nAttr; i++)
{
m_attributes[i] = new CheckBox();
m_attributes[i].Text = attributes[i];
m_attributes[i].Location = new Point(5, dummy.Height * i);
m_attributes[i].CheckedChanged += attribute_CheckedChanged;
Controls.Add(m_attributes[i]);
}
m_all = new CheckBox();
m_all.Text = "Check All";
m_all.Location = new Point(5, m_attributes[nAttr - 1].Bottom);
m_all.CheckedChanged += all_CheckedChanged;
Controls.Add(m_all);
}
private void attribute_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
{
foreach (CheckBox cb in m_attributes)
{
if (cb.Checked == false)
{
return;
}
}
m_all.Checked = true;
}
else if (m_all.Checked)
{
m_all.Checked = false;
}
}
private void all_CheckedChanged(object sender, EventArgs e)
{
if (m_all.Checked)
{
foreach (CheckBox cb in m_attributes)
{
cb.Checked = true;
}
}
else
{
foreach (CheckBox cb in m_attributes)
{
cb.Checked = false;
}
}
}
}
您可以在事件处理程序的开头检查All_check控件是否有焦点,如果没有焦点,则退出事件。
private void all_CheckedChanged(object sender, EventArgs e)
{
if (!m_all.Focused)
return ;
if (m_all.Checked)
{
foreach (CheckBox cb in m_attributes)
{
cb.Checked = true;
}
}
else
{
foreach (CheckBox cb in m_attributes)
{
cb.Checked = false;
}
}
}
您可以添加一个布尔成员级变量来标记事件处理程序逻辑是否短路,也可以取消订阅attribute_CheckedChanged
中的all_CheckedChanged
并在最后重新订阅。