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

しかし、このコードをカスタマイズして、すべてのチェックボックスが配置されているグループボックスで機能するようにする方法。ご案内ください。もう1つの問題は、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 に答える