2013-06-18 22 views
7

Wiem, jak znaleźć i zebrać listę wszystkich formantów używanych w formularzu systemu Windows. coś takiego:Znajdź komponenty na formularzu okna C# (nie dotyczy)

static public void FillControls(Control control, List<Control> AllControls) 
{ 
    String controlName = ""; 
    controlName = control.Name; 

    foreach (Control c in control.Controls) 
    { 
     controlName = c.Name; 
     if ((control.Controls.Count > 0)) 
     { 
      AllControls.Add(c); 
      FillControls(c, AllControls); 
     } 
    } 
} 

Jednak ta funkcja nie pobiera składniki non-wizualne na dole formularza Podobnie jak HelpProvider, ImageList, TableAdapters, zestawów danych, itp

Czy istnieje sposób, aby otrzymać również listę tych komponentów?

Edit:

Dzięki @HighCore za naprowadzenie mnie użyć System.ComponentModel.Component zamiast w podobnej funkcji robi się mi listę z elementów takiego się Imagelist, dostawca pomocy i BindingSource. Jednak nadal tęsknię z tej listy TableAdapters i DataSet. Przypuszczam, że ponieważ dziedziczą bezpośrednio z Object.

Proszę. Nie odsyłaj mnie do starszych postów, które pokazują podobną funkcję do mojej i otrzymują tylko listę kontrolek.

Edytuj: Dlaczego negatywne głosy? Na to pytanie nigdy wcześniej nie udzielono odpowiedzi!

+0

Nie jestem zaznajomiony z winformami, ale jeśli to, czego szukasz, to "Komponenty" (I.E 'System.ComponentModel.Component'), powinieneś użyć tego zamiast" Kontroli ". I BTW, zmień ten okropny kod foreach na piękne '.SelectMany()' –

+0

http://stackoverflow.com/questions/6736914/how-to-access-find-all-controls-and-all-components-i-o-o- form-in-c –

+1

Możliwy duplikat: [Jak uzyskać dostęp do wszystkich formantów i wszystkich komponentów w formularzu w języku C#?] (http://stackoverflow.com/questions/6736914/how-to-access-find-all-controls- i-all-komponenty-w-form-in-c) – SwDevMan81

Odpowiedz

12

Zaskakująco, wydaje się, że jedynym sposobem na zrobienie tego jest odbicie.

private IEnumerable<Component> EnumerateComponents() 
{ 
    return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 
      where typeof (Component).IsAssignableFrom(field.FieldType) 
      let component = (Component) field.GetValue(this) 
      where component != null 
      select component; 
} 
+0

Tak, to jest zwycięzca. Dziękuję Ci bardzo!! –

+1

Przepraszam, wiem, że ten wątek jest stary, ale jestem zaskoczony, że jest to jedyny (i nie tak intuicyjny) sposób na uzyskanie składników formularza. Dziękuję Craigowi za to pytanie, a Michael za odpowiedź. Bardzo mi to pomogło. – nurchi