2

我创建了一个 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;
            }
        }
    }
}
4

2 回答 2

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;
        }
    }
}
于 2013-02-10T11:41:00.423 回答
1

您可以添加一个布尔成员级别变量来标记您的事件处理程序逻辑是否应该短路,或者您可以取消订阅all_CheckedChangedinattribute_CheckedChanged并在最后重新订阅。

于 2013-02-10T11:29:19.637 回答