2009-10-13 11 views

Odpowiedz

22

Najprostszym rozwiązaniem może być kaskady:

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

lub tym podobne; można oczywiście przekazać delegata, aby to dość ogólna:

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

potem takie rzeczy jak:

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

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

Naprawdę nie odpowiada na pytanie tytułowe - jak uzyskać wszystkie elementy sterujące - nie można edytować ich właściwości. – n00dles

+0

@ n00dles do cytowania z pytania: "Potrzebuję na przykład, aby wyłączyć wszystkie przyciski w formularzu" –

+0

Po napisaniu komentarza, pomyślałem ... może to tytuł, który wymaga edycji. Byłem trochę zirytowany, ponieważ szukałem odpowiedzi na tytułowe pytanie. Zrobić to jednak. (Od jednego _Marc_ do innego!) – n00dles

3

Sponsorowane:

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

Wolę leniwe podejście (iterator) do problem, więc to jest to, czego używam:

/// <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

Szukałem rozwiązania tego samego, aby włączyć/wyłączyć sterowanie oparte na typie, więc wymyśliłem podobne podejście do Luiscencio (możesz również zmodyfikować go, aby uzyskać wszystkie elementy sterujące lub zmienić inne właściwości).

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); 
} 
Powiązane problemy