复选框,用于(取消)选中所有其他复选框

本文关键字:复选框 其他 用于 取消 | 更新日期: 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并在最后重新订阅。