web-dev-qa-db-ja.com

フォームのすべてのチェックボックスを繰り返し処理するにはどうすればよいですか?

多くの動的に生成されたチェックボックスを持つフォームがあります。実行時に、それぞれの値とIDを取得できるように、それぞれを繰り返し処理するにはどうすればよいですか?

21
NinjaCat
foreach(Control c in this.Controls)
{
   if(c is CheckBox)
   {
   // Do stuff here ;]
   }
}
38
Michal Franc

私はすべてのコントロールタイプで機能する単純な拡張メソッドを使用します。

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

IEnumerableを使用すると、結果を保存する方法を選択できます。また、linqを使用できます。

var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
18
Robert Jeppesen

Windows Forms の場合、次のように試すことができます。

private void button1_Click(object sender, EventArgs e)
{
    Dictionary<string, bool> checkBoxes = new Dictionary<string, bool>();
    LoopControls(checkBoxes, this.Controls);
}

private void LoopControls(Dictionary<string, bool> checkBoxes, Control.ControlCollection controls)
{
    foreach (Control control in controls)
    {
        if (control is CheckBox)
            checkBoxes.Add(control.Name, ((CheckBox) control).Checked);
        if (control.Controls.Count > 0)
            LoopControls(checkBoxes, control.Controls);
    }
}

コンテナコントロールには子を含めることができるので、それらもチェックすることをお勧めします。

12
Adriaan Stander

このように、多分(それが Windows Forms の場合):

foreach(var checkBox in myForm.Controls.OfType<CheckBox>())
{   
   //Do something.
}
9
Max Galkin

それらが作成されたら、値への参照のリストを取得し、リストを反復処理できます。

1
harryovers

これは古いことは知っていますが、想像できるほど簡単でした。

すべてのチェックボックスをList<Checkbox>に追加するだけで、すべてのチェックボックスの状態がリストに含まれ、リスト内のUIで変更された場合でも変更されます。

List<Checkbox> checkboxes = new List<Checkboxes>();
checkboxes.Add(chk1);
checkboxes.Add(chk2);
//So add all checkboxes you wanna iterate

foreach(Checkbox checkbox in checkboxes){
    //Do something using checkbox object
}

お役に立てれば :)

0
Allan Ramirez
myForm.Controls.OfType<CheckBox>().ToList().ForEach(c => c...);

チェックボックスがGroupBoxまたはPanel内にある場合は、「myForm」の代わりにその名前を使用します。

0