2009-11-24 147 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 
} 

希望這有助於:)