Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复选框以(取消)选中所有其他复选框_C#_Winforms_Checkbox - Fatal编程技术网

C# 复选框以(取消)选中所有其他复选框

C# 复选框以(取消)选中所有其他复选框,c#,winforms,checkbox,C#,Winforms,Checkbox,我已经创建了一个windows窗体,它(到目前为止)只包含复选框。构造函数接受一个参数:string[]attributes。对于此属性数组中的每个字符串,我创建一个复选框 例如: string[] attributes = { "Black", "Red", "Blue" }; form1 = n

我已经创建了一个windows窗体,它(到目前为止)只包含复选框。构造函数接受一个参数:
string[]attributes
。对于此
属性
数组中的每个字符串,我创建一个复选框

例如:

string[] attributes = {
                          "Black",
                          "Red",
                          "Blue"
                      };
form1 = new MyForm(attributes);
form1.Show();
将创建如下复选框:

[ ] Black
[ ] Red
[ ] Blue
这个很好用。现在,我的下一步是创建一个复选框“checkall”,它具有以下行为。我将使用
引用我的“全选”复选框

当:

  • 用户选中此
:选中所有其他复选框
  • 用户取消选中此
  • :取消选中所有其他复选框
  • 手动选中所有其他复选框:
    也被选中
  • 所有复选框都被选中,其中任何复选框都被取消选中:
    也被取消选中
  • 我设法做到了上面所有的规则,但我遇到了一个问题,我不知道如何解决它:当所有复选框都被选中,用户取消选中一个复选框时,这意味着我的“全部选中”复选框也将被取消选中。现在我的“全部选中”复选框被取消选中,它会自动调用取消选中事件,然后取消选中所有复选框,就像用户取消选中我的“全部选中”复选框一样

    那么,当另一个复选框调用取消选中时,有没有办法告诉我的复选框不要运行
    CheckedChanged

    以下是我的代码(都是手工编写的,因此没有使用visual studio设计器):

    使用系统;
    使用系统图;
    使用System.Windows.Forms;
    类MyForm
    {
    公共MyForm(字符串[]属性)
    {
    控制(属性);
    }
    私有复选框[]m_属性;
    私人复选框Mu all;
    专用控件(字符串[]属性)
    {
    复选框dummy=新复选框();
    int nAttr=attributes.Length;
    m_属性=新复选框[nAttr];
    for(int i=0;i
    您可以添加一个布尔成员级变量,用于标记事件处理程序逻辑是否短路,或者您可以取消订阅
    属性\u CheckedChanged
    中的
    所有\u CheckedChanged
    ,并在最后重新订阅。

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

    您可以检查all\u 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;
            }
        }
    }
    

    您可以检查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;
            }
        }
    }
    

    太棒了,我没想到。谢谢,如果没有其他答案,我很快就会接受:)太棒了,没想到。谢谢,如果没有其他答案,我很快就会接受:)嗯,另一个好的解决方案,我也会看一看,谢谢:挂起使用这个,在我看来更干净,特别是在给if语句添加了评论之后:)嗯,另一个好的解决方案,我也会看一看,谢谢:挂起使用这个,在我看来更干净,尤其是在if语句中添加注释后:)