如何遍历表单上的所有复选框?

Nin*_*Cat 20 c# checkbox winforms

我有一个包含许多动态生成的复选框的表单.在运行时,我如何迭代它们中的每一个,以便获得它们的值和ID?

Mic*_*anc 37

foreach(Control c in this.Controls)
{
   if(c is CheckBox)
   {
   // Do stuff here ;]
   }
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*sen 18

我使用一个简单的扩展方法,适用于任何控件类型:

  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;
        }
     }
  }
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样使用它:

var checkboxes = control.AllControls<CheckBox>();
Run Code Online (Sandbox Code Playgroud)

使用IEnumerable可以选择如何存储结果,还可以使用linq:

var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
Run Code Online (Sandbox Code Playgroud)


Adr*_*der 11

如果是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,容器控件可以包含子项,因此您可能也想检查它们.


Max*_*kin 8

像这样,也许(如果它在Windows窗体中):

foreach(var checkBox in myForm.Controls.OfType<CheckBox>())
{   
   //Do something.
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经做了一段时间了 - 只要我知道容器里没有嵌套.您可能会提到您的解决方案还允许为不知道的人附加.(其中c => c.Checked)(或其他Linq表达式). (2认同)