检查是否已选中所有表单复选框

时间:2019-01-03 22:05:08

标签: c# winforms

我有多个复选框是根据代码创建的,所以我知道我可以使用以下复选框:

foreach (var checkBox in this.Controls.OfType<CheckBox>())
            {

            }

但是我想知道还是希望得到的结果是知道是否检查了表单中的所有复选框,例如布尔值,如果所有复选框都返回true,或者如果缺少则返回false ...我该如何实现?问候

bool allChecked = ... 

3 个答案:

答案 0 :(得分:5)

简单地

bool allChecked = this.Controls.OfType<CheckBox>().All(c => c.Checked);

我不确定AllControls(在未经编辑的原始帖子中)是什么。因为此属性似乎不是标准属性。本示例使用任何控件容器(例如顶级Form)中存在的标准Controls集合

如果将CheckBox分布在不同的控件容器中,则问题会更加复杂。在这种情况下,您可以使用递归函数来迭代浏览控件并计算被检查的数量

int result = RecursiveCheck(f.Controls);
if(result > 0)
    Console.WriteLine("Something is not checked");

int RecursiveCheck(Control.ControlCollection col)
{
    int count = 0;
    foreach(Control c in col)
    {
        if (c.Controls.Count > 0)
        {
            count += c.Controls.OfType<CheckBox>().Count(x => !x.Checked);
            count += RecursiveCheck(c.Controls);
        }   
    }
    return count;
}

答案 1 :(得分:1)

如果您想验证是否选中了表单上的所有复选框,即使是属于其他容器控件的复选框,则也必须遍历每个控件的Controls集合(而不仅是属于{{1 }}。

一种实现方法是编写一个递归方法,该方法采用容器控件(如Form)并检查其集合中的所有控件。如果任何包含的控件是Form并且未选中,则返回Checkbox。否则,请对该控件的false集合执行递归检查。如果这些检查都不为假,则返回true。

例如:

Controls

现在,如果调用此方法并将主表单作为容器控件传递,则将检查表单上的所有控件,包括所有容器(甚至嵌套容器)中的所有控件:

private static bool ContainedCheckboxesAreChecked(Control containerControl)
{        
    // For each control in the container
    foreach (Control control in containerControl.Controls)
    {
        // Return false if the control is a checkbox and it's not checked
        if (!(control as CheckBox)?.Checked ?? false) return false;

        // Do a recursive check on this control's Controls collection
        if (!ContainedCheckboxesAreChecked(control)) return false;
    }

    // If we got this far, return true
    return true;
}

答案 2 :(得分:0)

如果确定复选框可用,则可以使用

 var allChecked = this.Controls.OfType<CheckBox>().All(x => x.Checked);

但是如果Enumerable可能没有结果,那么您需要使用下面的代码。因为所有运算符都返回true为空的Enumerable

    bool allChecked = false;
    var checkBoxes = this.Controls.OfType<CheckBox>();
    if (checkBoxes.Any())
        allChecked = checkboxes.All(x => x.Checked);