2009-10-13 18 views

Respuesta

22

La opción más simple puede ser la de la cascada:

public static void SetEnabled(Control control, bool enabled) { 
    control.Enabled = enabled; 
    foreach(Control child in control.Controls) { 
     SetEnabled(child, enabled); 
    } 
} 

o similares; Por supuesto podría pasar a un delegado para que sea bastante genérico:

public static void ApplyAll(Control control, Action<Control> action) { 
    action(control); 
    foreach(Control child in control.Controls) { 
     ApplyAll(child, action); 
    } 
} 

entonces cosas como:

ApplyAll(this, c => c.Validate()); 

ApplyAll(this, c => {c.Enabled = false; }); 
+0

Realmente no responde la pregunta del título - cómo obtener todos los controles - no edita sus propiedades. – n00dles

+0

@ n00dles para citar la pregunta: "Necesito, por ejemplo, desactivar todos los botones en un formulario" –

+0

Después de escribir el comentario, pensé ... tal vez es el título que necesita edición. Estaba un poco irritado porque estaba buscando una respuesta a la pregunta del título. Hecho sin embargo, sin embargo. (De un _Marc_ a otro!) – n00dles

3

Proveedores:

public List<Control> getControls(string what, Control where) 
    { 
     List<Control> controles = new List<Control>(); 
     foreach (Control c in where.Controls) 
     { 
      if (c.GetType().Name == what) 
      { 
       controles.Add(c); 
      } 
      else if (c.Controls.Count > 0) 
      { 
       controles.AddRange(getControls(what, c)); 
      } 
     } 
     return controles; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     var c = getControls("Button", this); 

    } 
4

que prefieren un enfoque perezoso (repetidor) a el problema, así que esto es lo que uso:

/// <summary> Return all of the children in the hierarchy of the control. </summary> 
/// <exception cref="ArgumentNullException"> Thrown when one or more required arguments are null. </exception> 
/// <param name="control"> The control that serves as the root of the hierarchy. </param> 
/// <param name="maxDepth"> (optional) The maximum number of levels to iterate. Zero would be no 
/// controls, 1 would be just the children of the control, 2 would include the children of the 
/// children. </param> 
/// <returns> 
/// An enumerator that allows foreach to be used to process iterate all children in this 
/// hierarchy. 
/// </returns> 
public static IEnumerable<Control> IterateAllChildren(this Control control, 
                 int maxDepth = int.MaxValue) 
{ 
    if (control == null) 
    throw new ArgumentNullException("control"); 

    if (maxDepth == 0) 
    return new Control[0]; 

    return IterateAllChildrenSafe(control, 1, maxDepth); 
} 


private static IEnumerable<Control> IterateAllChildrenSafe(Control rootControl, 
                  int depth, 
                  int maxDepth) 
{ 
    foreach (Control control in rootControl.Controls) 
    { 
    yield return control; 

    // only iterate children if we're not too far deep and if we 
    // actually have children 
    if (depth >= maxDepth || control.Controls.Count == 0) 
     continue; 

    var children = IterateAllChildrenSafe(control, depth + 1, maxDepth); 
    foreach (Control subChildControl in children) 
    { 
     yield return subChildControl; 
    } 
    } 
} 
0

He estado buscando una solución para la misma para habilitar/deshabilitar los controles basados ​​en el tipo, así que se me ocurrió este enfoque similar al de Luiscencio (también puede modificarlo para obtener todos los controles o cambiar otras propiedades).

public static void setEnabled (ControlCollection cntrList ,bool enabled,List<Type> typeList = null) 
{ 
    foreach (Control cntr in cntrList) 
    { 
     if (cntr.Controls.Count == 0) 
      if (typeList != null) 
      { 
       if (typeList.Contains(cntr.GetType())) 
        cntr.Enabled = enabled; 
      } 
      else 
       cntr.Enabled = enabled; 
     else 
       setEnabled(cntr.Controls, enabled, typeList); 
    } 
} 

public void loadFormEvents() 
{ 
    List<Type> list = new List<Type>(); 
    list.Add(typeof(TextBox)); 
    setEnabled(frm.Controls ,false,list); 
} 
Cuestiones relacionadas