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

时间:2020-04-15 09:47:34

标签: c# if-statement logical-operators

我总共有6个复选框。我想根据剩余5个复选框的状态选中或取消选中第6个复选框。 如果两个或多个复选框中的任何一个被选中为true,则第6个复选框应为true,否则为false。 我尝试了不同的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个复选框为true时,此逻辑不起作用。在这种情况下,第六个应该为假,但不能为假。 有什么建议?? 对于选中事件下的所有复选框,我都有此代码。

5 个答案:

答案 0 :(得分:2)

问题出在第16行的if语句中,因为如果未选中checkBox1并选中了其他复选框之一,它将自动启用checkBox6。因为您基本上是在检查是否检查了其他4个复选框中的任何一个,如果没有选中checkBox1,则它将转到第16行并传递if语句,因为您使用的是||。运算符,请考虑使用&&运算符,并查看其工作原理。

C# operators (C# reference)

进行此操作的另一种方法是检查窗体中的控件是否为CheckBox并计算已选中的复选框的数量,并确保它不是checkBox6的实例,这样您就可以使用无止境的checkBox并仅具有一个检查所有功能的小功能

        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”添加到所有其他复选框中

答案 1 :(得分:2)

我将创建一个单独的方法,您的每个复选框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();
}

答案 2 :(得分:1)

尝试这种方式: 向此方法添加1-5个复选框的input >> D.SetDay(day) >> D.SetMonth(month) >> D.SetYear(year); 事件。

day

答案 3 :(得分:1)

您可以尝试使用 Linq 查询function rotateArray(N, NArray) { const lastItem = NArray[NArray.length - 1]; const firstItems = NArray.slice(0, NArray.length - 1); return [lastItem].concat(firstItems); } console.log(rotateArray(1, [1, 2, 3, 4])); es

集合(例如数组)
CheckBox

不要忘记将全部 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; } .. checkBox1 checkBox5事件处理程序分配给CheckedChanged

答案 4 :(得分:0)

根据您的逻辑尝试此操作

        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;
        }
    }