我创建了一个窗口表单(到目前为止)只包含复选框。构造函数采用一个参数: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;
}
}
}
}
答案 0 :(得分:3)
您可以检查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;
}
}
}
答案 1 :(得分:1)
您可以添加一个布尔成员级别变量,该变量会标记您的事件处理程序逻辑是否应该短路,或者您可以取消订阅all_CheckedChanged
中的attribute_CheckedChanged
并在最后重新订阅。