复选框(取消选中所有其他复选框

时间:2013-02-10 11:27:17

标签: c# winforms checkbox

我创建了一个窗口表单(到目前为止)只包含复选框。构造函数采用一个参数: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;
            }
        }
    }
}

2 个答案:

答案 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并在最后重新订阅。