2009-11-24 144 views
17

我有一个表格,有很多动态生成的复选框。在运行时,我怎样才能遍历它们中的每一个,以便我可以获得它们的值和ID?如何遍历表单上的所有复选框?

+0

你在谈论Windows窗体或ASP.NET? – 2009-11-24 07:47:07

回答

36
foreach(Control c in this.Controls) 
{ 
    if(c is CheckBox) 
    { 
    // Do stuff here ;] 
    } 
} 
+1

如果控件嵌入其他控件内部,则不起作用。 “这个”并不是一切。 – Fandango68 2017-03-22 05:17:34

+0

是的@费尔南多68你必须创造一个经历所有'孩子'的复发功能。 这是一个从近8年前的答案:D – 2017-04-07 12:36:08

+0

是的,它不工作 – 2018-03-07 07:03:39

1

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

8

这样,也许(如果它在Windows Forms):

foreach(var checkBox in myForm.Controls.OfType<CheckBox>()) 
{ 
    //Do something. 
} 
+2

我一直在做这一段时间 - 只要我知道没有在容器中嵌套。您可能会提到,您的解决方案还允许将.Where(c => c.Checked)(或其他Linq表达式)附加到未知内容。 – Herb 2011-10-06 19:10:19

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

记住,容器控件可以包含孩子,所以你可能也想检查一下。

14

我用一个简单的扩展方法,将任何控制类型的工作:

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

+1它们可以嵌套,好点,并且使用lambda总是加号) – 2009-11-24 10:54:39

+0

这可能比Control.Controls更有用 – 2010-03-13 15:33:52

+0

+1用于查找嵌套控件。这个答案是最好的。 – 2013-05-06 23:18:02

0

我知道这是旧的,但它很容易,因为我可以ima gine。

只需将所有复选框添加到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 
} 

希望这有助于:)