1

我发现可以验证 linq 是否选择了复选框。

我得到了像这样的代码

btnAgree.Enabled = (from chkbox in Controls.OfType<CheckBox>() select chkbox).Count(b => b.Checked) >= 2;

但我的情况就像我的获胜表单上有很多复选框,但我想检查我的组框内的任何复选框都被 LINQ 选中。有可能吗,但我还是没有办法。请帮我写代码。

我有一个有点相似的小代码。代码如下

public static IEnumerable<T> AllControls<T>(this Control startingPoint) where T : Control
{
 bool hit = startingPoint is T;
 if (hit)
 {
    yield return startingPoint as T;
 }
 foreach (var child in startingPoint.Controls.Cast<Control>())
 {
    foreach (var item in AllControls<T>(child))
    {
       yield return item;
    }
 }

}

 var checkboxes = control.AllControls<CheckBox>();
 var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);

但是如何自定义此代码以使其与我的所有复选框所在的组框一起使用。请指导。另一个问题是我使用的是 c# v2.0。谢谢

4

3 回答 3

4
btnAgree.Enabled = 
    (from chkbox in groupBox1.Controls.OfType<CheckBox>()
     select chkbox).Count(b => b.Checked) >= 2;

您正在检查表单的控件。

于 2012-05-14T08:31:02.080 回答
4

您不需要使用表单的控件集合,您可以使用GroupBox 的控件集合

btnAgree.Enabled = GroupBox1.Controls.OfType<CheckBox>()
                  .Where(chk => chk.Checked)
                  .Count() >= 2;
于 2012-05-14T08:32:51.360 回答
1

如果您需要递归(假设您的 GroupBox 中有一个面板,并且复选框已添加到面板中),我认为您的扩展方法仍然有用

改变了一点

public static IEnumerable<T> AllControls<T>(this Control startingPoint) where T : Control
        {
            if (startingPoint is T)
                yield return startingPoint as T;

            foreach (var item in startingPoint.Controls.Cast<Control>().SelectMany(AllControls<T>))
                yield return item;
        }

用法 :

var list = groupBox1.AllControls<CheckBox>();
var listChecked = list.Where(m => m.Checked);
于 2012-05-14T08:36:36.993 回答