我创建了一个 Windows 表单,它(到目前为止)只包含复选框。构造函数接受一个参数:string[] attributes
. 对于这个attributes
数组中的每个字符串,我创建一个复选框。
例如:
string[] attributes = {
"Black",
"Red",
"Blue"
};
form1 = new MyForm(attributes);
form1.Show();
将像这样创建复选框:
[ ] Black
[ ] Red
[ ] Blue
这工作得很好。现在我的下一步是创建一个复选框“Check All”,它具有以下行为。我将使用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;
}
}
}
}