复选框选中状态更改取决于其他五个复选框

Checkbox Checked status change depends on five other checkboxs

我总共有 6 个复选框。我想根据剩余 5 个复选框的状态选中或取消选中第 6 个复选框。 如果两个或更多复选框中的任何一个被选中,那么第 6 个应该为真,否则为假。 我尝试了不同的 if 语句但没有成功。 到目前为止我发现的最好的是这个逻辑

  private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked == true)
        {
            if (checkBox2.Checked == true || checkBox3.Checked == true || checkBox4.Checked == true || checkBox5.Checked == true)
            {
                checkBox6.Checked = true;
            }
            else
            {
                checkBox6.Checked = false;
            }

        }
        else
        {
            if ((checkBox2.Checked == true || checkBox3.Checked == true) || (checkBox4.Checked == true || checkBox5.Checked == true))
            {
                checkBox6.Checked = true;
            }
            else
            {
                checkBox6.Checked = false;
            }

        }
    }

当我只有 1 个复选框选中时,此逻辑不起作用。在那种情况下,第 6 个应该是假的,但不是。 有什么建议么?? 我有这个代码用于选中事件下的所有复选框。

根据您的逻辑试试这个

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        checkBox6.Checked = false;
        if (checkBox1.Checked && (checkBox2.Checked || checkBox3.Checked || checkBox4.Checked || checkBox5.Checked))
        {
            checkBox6.Checked = true;
        }
        else if ((checkBox2.Checked && checkBox3.Checked) || (checkBox4.Checked && checkBox5.Checked))
        {
            checkBox6.Checked = true;
        }
    }

试试这个方法: 向此方法添加 CheckedChanged 1-5 个复选框的事件。

private void checkBox_CheckedChanged(object sender, EventArgs e)
{
       int count = 0;
       if (checkBox1.Checked)
        count++;
       if (checkBox2.Checked)
        count++;
       if (checkBox3.Checked)
        count++;
       if (checkBox4.Checked)
        count++;
       if (checkBox5.Checked)
        count++;
       checkBox6.Checked = count >= 2;
}

问题出在第 16 行的 if 语句中,因为如果未选中 checkBox1 而选中其他复选框之一,它将自动启用要选中的 checkBox6。因为你基本上是在检查其他 4 个复选框中的任何一个是否被选中,如果一个没有被选中,它将转到第 16 行并通过 if 语句,因为你正在使用 ||运营商,考虑使用 && 运营商,看看他们是如何工作的。

C# operators (C# reference)

进行此操作的另一种方法是检查表单中的控件是否为 CheckBox 并计算选中的复选框数量并确保它不是 checkBox6 的实例,这样您就可以使用无穷无尽的复选框并拥有只是一个检查所有这些的小函数

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            int i = 0;
            foreach (CheckBox item in this.Controls) // Loop all checkboxes in form
            {
                if (item.CheckState == CheckState.Checked && item != checkBox6) // Check if checkbox is checked and not instance of checkBox6
                {
                    i++; // Increment amount of checkBoxes checked
                }

            }
            checkBox6.Checked = i >= 2 ? true : false; // enable checkBox6 if more than 2 checkboxes are checked
        }

不要忘记将 CheckChanged 事件 "checkBox1_CheckedChanged" 添加到所有其他复选框

我会创建一个单独的方法,您的每个复选框 CheckChange 事件都可以调用:

private void SetCheckBox6()
{
    var checkboxStatuses = new List<bool>
    {
        checkbox1.Checked,
        checkbox2.Checked,
        checkbox3.Checked,
        checkbox4.Checked,
        checkbox5.Checked
    }

    checkbox6.Checked = false;

    if(checkboxStatuses.Where(x => x == true).Count() > 1)
    {
        checkbox6.Checked = true;
    }
}

这样使用:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    //Other logic that needs to happen on check changed...

    SetCheckBox6();
}

您可以尝试 Linq 来查询 集合(例如,数组)CheckBoxes

using System.Linq;

...

private void checkBox1_CheckedChanged(object sender, EventArgs e) {
  checkBox6.Checked = new bool[] {
    checkBox1.Checked, 
    checkBox2.Checked, 
    checkBox3.Checked, 
    checkBox4.Checked, 
    checkBox5.Checked}.Count(c => c) >= 2;
}

不要忘记将 all checkBox1..checkBox5 CheckedChanged 事件处理程序分配给 checkBox1_CheckedChanged