2009-11-24 17 views

Respuesta

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

No funciona si los controles están incrustados dentro de otros controles. "esto" no es todo. – Fandango68

+0

Sí @ Fernando68 tendrías que crear una función recurrente que pase por todos los 'hijos'. Esta es una respuesta de hace casi 8 años: D –

+0

Sí, no funciona –

1

Cuando se crean, obtenga una lista de referencias a los valores, y luego puede recorrer la lista.

8

como no, tal vez (si es en Windows Forms):

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

He estado haciendo esto por un tiempo, siempre que sepa que no hay nido en los contenedores. Puede mencionar que su solución también permite agregar .adhere (c => c.Checked) (u otra expresión de Linq) para el inconsciente. – Herb

11

Si es Windows Forms, puede intentar algo como esto:

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

recordar que controles contenedores pueden contener los niños, por lo es posible que desee verificarlos también.

14

utilizo un método simple extensión que va a trabajar para cualquier tipo de control:

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

A continuación, se puede usar como tal:

var checkboxes = control.AllControls<CheckBox>(); 

Usando IEnumerable le permite elegir la forma de almacenar la resultados, y también le permite usar linq:

var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked); 
+0

+1 se pueden anidar, buen punto, y el uso de lambdas siempre es un plus) –

+0

Esto es probablemente más útil que Control.Controles –

+0

+1 Para encontrar controles anidados. Esta respuesta es la mejor. –

0

Sé que esto es viejo, pero fue fácil, ya que puedo ima gine.

Solo agregue todas las casillas de verificación en un List<Checkbox>, todas las casillas de verificación están en la lista e incluso si cambian en la interfaz de usuario en la lista también.

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 
} 

Espero que esto ayude :)

Cuestiones relacionadas