2011-12-21 11 views
10

Szukam przykładu kodu, jak uzyskać wszystkie dzieci kontroli nadrzędnej.Jak zdobyć wszystkie dzieci kontroli nad rodzicami?

Nie mam pojęcia, jak to zrobić.

foreach (Control control in Controls) 
{ 
    if (control.HasChildren) 
    { 
    ?? 
    } 
} 
+0

swoje pytanie nie jest jasne. Jak chcesz "uzyskać" te kontrolki, widząc jak już wiesz, jak je przeglądać? –

+0

Jesteś już iterowanie dzieci z pętli foreach. Przynajmniej dzieci tego. Kontrolują, prawdopodobnie formę. W inny sposób nie jest jasne, co masz na myśli mówiąc "kontrola rodzicielska". –

Odpowiedz

15

Jeśli chcesz tylko natychmiastowe dzieci, należy

... 
var children = control.Controls.OfType<Control>(); 
... 

Jeśli chcesz wszystkie kontrolki od hierarchii (czyli wszystko w drzewie pod pewną kontrolą), użyj:

private IEnumerable<Control> GetControlHierarchy(Control root) 
    { 
     var queue = new Queue<Control>(); 

     queue.Enqueue(root); 

     do 
     { 
      var control = queue.Dequeue(); 

      yield return control; 

      foreach (var child in control.Controls.OfType<Control>()) 
       queue.Enqueue(child); 

     } while (queue.Count > 0); 

    } 

następnie można użyć coś takiego w postaci:

private void button1_Click(object sender, EventArgs e) 
    { 
     /// get all of the controls in the form's hierarchy in a List<> 
     var controlList = GetControlHierarchy(this).ToList(); 

     foreach (var control in controlList) 
     { 
      /// do something with this control 
     } 
    } 

Zauważ, że .ToList() natychmiast oceni całą Enumerable, co eliminuje wszelkie korzyści, jakie można uzyskać dzięki implementacji coroutine.

4

Kontrole mają MyControl.Controls kolekcję które można zrobić foreach dalej.

Każda kontrola ma również właściwość Parent, która daje kontrolę nadrzędną.

Możesz napisać metodę rekurencyjną, jeśli chcesz przejść na nieznaną liczbę poziomów.

2

Może to być przydatne dla kogoś:

public void GetControlsCollection(Control root,ref List<Control> AllControls, Func<Control,Control> filter) 
{ 
    foreach (Control child in root.Controls) 
    { 
     var childFiltered = filter(child); 
     if (childFiltered != null) AllControls.Add(child); 
     if (child.HasControls()) GetControlsCollection(child, ref AllControls, filter); 
    } 
} 

Jest to funkcja rekurencyjna, aby uzyskać zbiór kontroli z możliwością Appling filtra (na expample wg rodzaju). A przykład:

List<Control> resultControlList = new List<Control>(); 
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null)); 

To zwróci wszystkie DropDownLists w rootControl i jego wszystkie dzieci

0

Prawdopodobnie zbyt skomplikowane, ale przy użyciu LINQ i niektóre pomysły z wyżej/Inne miejsca:

public static IEnumerable<Control> GetAllChildren(this Control root) { 
     var q = new Queue<Control>(root.Controls.Cast<Control>()); 

     while (q.Any()) { 
      var next = q.Dequeue(); 
      next.Controls.Cast<Control>().ToList().ForEach(q.Enqueue); 

      yield return next; 
     } 
    } 
Powiązane problemy