【问题标题】:C# I need a more efficient way to check values in multiple checkboxes to change a boolC# 我需要一种更有效的方法来检查多个复选框中的值以更改布尔值
【发布时间】:2021-08-22 03:45:10
【问题描述】:

所以我有一个小任务,如果我的任何复选框被打开,我试图更改一个布尔值。

所以我有一个布尔值

Boolean YourAllowedToWork = false;

还有一组复选框

private void 001_Click(object sender, EventArgs e)
    {
        if (001.Checked)
        {
            YourAllowedToWork = true;
        }
        else
        {
            YourAllowedToWork = false;
        }
    }

    private void 002_Click(object sender, EventArgs e)
    {
        if (002.Checked)
        {
            YourAllowedToWork = true;
        }
        else
        {
            YourAllowedToWork = false;
        }
    }

    private void 003_Click(object sender, EventArgs e)
    {
        if (003.Checked)
        {
            YourAllowedToWork = true;
        }
        else
        {
            YourAllowedToWork = false;
        }
    }

    private void 004_Click(object sender, EventArgs e)
    {
        if (004.Checked)
        {
            YourAllowedToWork = true;
        }
        else
        {
            YourAllowedToWork = false;
        }
    }

    private void 005_Click(object sender, EventArgs e)
    {
        if (005.Checked)
        {
            YourAllowedToWork = true;
        }
        else
        {
            YourAllowedToWork = false;
        }
    }

    private void 006_Click(object sender, EventArgs e)
    {
        if (006.Checked)
        {
            YourAllowedToWork = true;
        }
        else
        {
            YourAllowedToWork = false;
        }
    }

虽然我还没有测试过,但在我看来这会导致自身冲突的问题,而且显然效率不高。我对编程还是很陌生,而且只有 6 天的时间才能接触到 C#。

谁能告诉我一个更好的方法来完成上述任务?我假设有某种方法可以将所有这些复选框放入一个列表中并监听其中任何一个的更改,然后检查列表以查看是否有任何复选框值为真,如果它们为真,则将单个布尔值更改为真!

谢谢

【问题讨论】:

  • 这如何编译? c#中的变量名不允许以数字开头

标签: c# checkbox boolean


【解决方案1】:

您可以将这些复选框存储在generic list 甚至array

我认为最简单的方法是使用数组

bool YourAllowedToWork = false;
public void Check()
{
   CheckBox[] checkboxes = { chck1, chck2, chck3 };
   foreach(CheckBox checkbox in checkboxes){
      if(checkbox.Checked == true){
          YourAllowedToWork = true
      }
   }
}

【讨论】:

  • 林克,bool YourAllowedToWork = checkboxes.Any(x => x.Checked);
  • 谢谢@AndreiSolero 这几乎可以工作,但是只要我在 if 语句中添加 Else ,它总是会触发 false。如果我关闭复选框,如何让它重新检查列表? bool YourAllowedToWork = false; public void Check() { CheckBox[] checkboxes = { chck1, chck2, chck3 }; foreach(复选框中的复选框){ if(checkbox.Checked == true){ YourAllowedToWork = true; } 其他 { YourAllowedToWork = false; ///////////// 在这里发布 ////////////// } } }
  • @Oogle_doogleson,你不应该再在if块上添加else语句,如果你只想将YourAllowedToWork设置为false,因为它已经在变量声明中初始化为false /跨度>
【解决方案2】:

所有复选框只能有一个事件。在该单一事件中,使用 OR 条件检查复选框选中状态。

我认为您正在使用 Windows 应用程序。在您的设计器文件中,将所有复选框的单击事件更改为一个事件,如下所示

this.001.Click += new System.EventHandler(this.checkBox1_Click);
this.002.Click += new System.EventHandler(this.checkBox1_Click);
this.003.Click += new System.EventHandler(this.checkBox1_Click); 

在代码隐藏文件中的点击事件中使用或所有复选框的条件

private void checkBox1_Click(object sender, EventArgs e)
  {           
     YourAllowedToWork = 001.Checked || 002.Checked || 003.Checked;           
   }

【讨论】:

    【解决方案3】:

    像 AndreiSolero 的回答一样,但是 Windows 窗体已经通过它的工作方式将它们存储在一个集合中;控件存在于层次结构中,因此要出现在表单上,​​它们必须已经存储在可以查询的集合中

    bool youreAllowedToWork = x.Controls.OfType<CheckBox>().Where(cb => RegEx.IsMatch("^\\d{3}$", cb.Name).Any(cb => cb.Checked)
    

    x 是复选框所在的控件(例如表单本身或面板/组框) - 您应该将其更改为例如this 如果复选框在表单上,​​或者面板名称如果它们在面板中。

    我假设复选框都在表单内,并且还与其他由于工作原因计算不感兴趣的复选框混合在一起,所以那里有一个正则表达式来检查控件的名称是 3 位数字(尽管我认为您必须在问题代码中掩盖了真实姓名,因为它甚至不应该编译 - c# 禁止以数字开头的名称)这将检查限制为仅我们感兴趣的工作原因复选框。这个正则表达式可能需要更改为说明您的控件名称的真正含义 - 请继续阅读以获取有关这一点的更多建议,因为我建议您不要使用正则表达式,让您的生活更轻松:

    如果您想将所有复选框放在他们自己的面板中并且在该面板中没有其他非工作原因复选框,那么您可以删除 .Where(...) 并拥有例如:

    bool youreAllowedToWork = workReasonsPanel.Controls.OfType<CheckBox>().Any(cb => cb.Checked)
    

    如果您将复选框与不属于“您可以工作”原因的其他复选框混合在一起,也许通过将它们命名为比数字更好的名称来简化您的生活会有所帮助。 都叫他们,例如workReason1workReason2...

    那么代码可以是:

    bool youreAllowedToWork = x.Controls.OfType<CheckBox>().Where(cb => cb.Name.StartsWith("workReason")).Any(cb => cb.Checked)
    

    我会使用面板方法或带有一致前缀的简单名称方法,因为这意味着添加更多工作原因所需要做的就是向面板添加另一个复选框/添加另一个复选框名称一致

    如果您的复选框都在 UI 中的同一位置,请使用面板方法,如果它们分散在 UI 中并与其他非工作原因复选框混合,请使用名称方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2015-04-28
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多