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

C# 如何遍历表单上的所有复选框?,c#,winforms,checkbox,C#,Winforms,Checkbox,我有一个表单,它有许多动态生成的复选框。在运行时,我如何遍历它们中的每一个,以便获取它们的值和ID?当它们被创建时,获取一个值引用列表,然后您可以遍历该列表。类似于这样,可能(如果在中): foreach(Control c in this.Controls) { if(c is CheckBox) { // Do stuff here ;] } } foreach(myForm.Controls.OfType()中的var复选框) { //做点什么。 } 如果是

我有一个表单,它有许多动态生成的复选框。在运行时,我如何遍历它们中的每一个,以便获取它们的值和ID?

当它们被创建时,获取一个值引用列表,然后您可以遍历该列表。

类似于这样,可能(如果在中):

foreach(Control c in this.Controls)
{
   if(c is CheckBox)
   {
   // Do stuff here ;]
   }
}
foreach(myForm.Controls.OfType()中的var复选框)
{   
//做点什么。
}
如果是,您可以尝试以下方法:

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);
    }
}
private void按钮1\u单击(对象发送者,事件参数e)
{
字典复选框=新建字典();
LoopControls(复选框,this.Controls);
}
专用void循环控件(字典复选框、Control.ControlCollection控件)
{
foreach(控件中的控件)
{
如果(控件为复选框)
复选框.Add(control.Name,((CheckBox)control).Checked);
如果(control.Controls.Count>0)
LoopControls(复选框,control.Controls);
}
}

请记住,容器控件可以包含子控件,因此您可能也希望检查这些子控件。

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

  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;
        }
     }
  }
公共静态IEnumerable AllControls(此控件起始点),其中T:Control
{
布尔命中=起始点为T;
如果(命中)
{
收益率返回起始点为T;
}
foreach(startingPoint.Controls.Cast()中的var child)
{
foreach(所有控件中的var项(子项))
{
收益回报项目;
}
}
}
然后,您可以这样使用它:

var checkboxes = control.AllControls<CheckBox>();
var复选框=control.AllControls();
使用IEnumerable可以选择如何存储结果,还可以使用linq:

var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
var checkedboxs=control.AllControls()。其中(c=>c.Checked);

我知道这很古老,但正如我所能想象的那样,这很容易

只需将所有复选框添加到
列表中
,所有复选框的状态都在列表中,即使它们在列表中的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
}
列表复选框=新建列表();
复选框。添加(chk1);
复选框。添加(chk2);
//因此,添加所有要迭代的复选框
foreach(复选框中的复选框){
//使用复选框对象执行某些操作
}

希望这有帮助:)

你是说Windows窗体还是ASP.NET?+1它们可以嵌套,很好,使用lambdas总是一个优点)这可能比控件更有用。控件这绝对是最好、最优雅的Answer!干得好。我已经做了一段时间了——只要我知道容器中没有嵌套。您可能会提到,您的解决方案还允许将.Where(c=>c.Checked)(或其他Linq表达式)附加到ununknowledge。如果控件嵌入到其他控件中,则不起作用。“这”不是全部。是的@Fernando68您必须创建一个贯穿所有“子对象”的循环函数。这是近8年前的答案:D@AllanRamirez这个答案已经有9年历史了:)@MichalFranc嗨,我知道,但我找到了解决办法。@AllanRamirez真棒!
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
}