C# 检查是否选中了表单的所有复选框

C# 检查是否选中了表单的所有复选框,c#,winforms,C#,Winforms,我有多个复选框,这些复选框是我通过代码手工创建的,因此我知道我可以使用以下方法获取复选框: foreach (var checkBox in this.Controls.OfType<CheckBox>()) { } 简单地说 bool allChecked = this.Controls.OfType<CheckBox>().All(c => c.Checked); 如果您确定复选框可用,则可以使用 var

我有多个复选框,这些复选框是我通过代码手工创建的,因此我知道我可以使用以下方法获取复选框:

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

            }
简单地说

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

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

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

如果要验证是否选中了表单上的所有复选框,甚至是属于其他容器控件的复选框,则必须迭代每个控件的
控件
集合(而不仅仅是属于
表单

一种方法是编写一个递归方法,该方法接收容器控件(如
表单
)并检查其集合中的所有控件。如果包含的任何控件是
复选框
,但未选中,则返回
false
。否则,对该控件的
控件
集合执行递归检查。如果这些检查都不为false,则返回true

例如:

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;
}
现在,如果调用此函数并将主窗体作为容器控件传递,则将检查窗体上的所有控件,包括所有容器(甚至嵌套容器)中的控件:


你不能通过反转where子句的逻辑并检查计数是否等于零来获取所有未检查的控件吗?是否有任何复选框在面板或其他容器中?使用上面的代码,你可以从
bool allChecked=true开始
并在
foreach
中添加以下行:
if(!checkbox.Checked){allChecked=false;break;}
我尝试过,但它总是返回True VALUE它返回True,但这可能是不可取的,因为在this.control中找不到复选框。我尝试过,但它总是返回True VALUE您的复选框是否在某种容器中?(面板或组框)在这种情况下,您需要使用容器的控件集合,它们位于FlowLayoutPanel内,然后将其更改为FlowLayoutPanel的名称。问题是它们位于FlowLayoutPanel内,但在其中我有组框,因此每个组框都有不同的复选框,我有一个groupBox列表,所以我迭代为:
foreach(groupBox中的var g){}
,但是现在,如果所有复选框都在不同的groupBox中,我怎么知道它们是否都被选中了呢?
 var allChecked = this.Controls.OfType<CheckBox>().All(x => x.Checked);
    bool allChecked = false;
    var checkBoxes = this.Controls.OfType<CheckBox>();
    if (checkBoxes.Any())
        allChecked = checkboxes.All(x => x.Checked);
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;
}
bool allCheckBoxesAreChecked = ContainedCheckboxesAreChecked(this);