【问题标题】:Checkbox Checked status change depends on five other checkboxsCheckbox Checked 状态变化取决于其他五个复选框
【发布时间】:2020-04-15 09:47:34
【问题描述】:

我总共有 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 个复选框被选中时,此逻辑不起作用。在那种情况下,第六个应该是假的,但不是。 有什么建议?? 我在选中事件下的所有复选框都有此代码。

【问题讨论】:

  • 你可能用过||当你应该有&&。尝试更改此设置,看看会发生什么。
  • 这仅适用于 checkbox1 的 CheckChanged 事件,因此除非您在所有其他复选框 CheckChanged 事件中具有相同的代码,否则它将仅适用于第一个复选框。
  • @jason.kaisersmith 我试过但没有成功。

标签: c# if-statement logical-operators


【解决方案1】:

我会创建一个单独的方法,您的每个复选框 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】:

    问题在于第 16 行的 if 语句,因为如果未选中 checkBox1 并且选中了其他复选框之一,它将自动启用要选中的 checkBox6。因为您基本上是在检查是否选中了其他 4 个复选框中的任何一个,并且如果没有要检查的 checkBox1,它将转到第 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”添加到所有其他复选框

    【讨论】:

    • 如果其他复选框需要其他逻辑,最好将该事件添加到所有其他复选框。
    • @sr28 好吧,问题是他总共有 6 个复选框,如果有其他复选框,这将干预其他逻辑是正确的,但这只是该问题的另一种解决方案: ) 并且您可以随时将不需要检查的复选框添加到“if”语句中
    【解决方案3】:

    试试这个方法: 在该方法中添加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;
    }
    

    【讨论】:

      【解决方案4】:

      您可以尝试 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

      【讨论】:

        【解决方案5】:

        根据你的逻辑试试这个

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

        【讨论】:

          猜你喜欢
          • 2016-07-16
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-28
          • 1970-01-01
          • 1970-01-01
          • 2019-09-26
          相关资源
          最近更新 更多