2013-06-18 9 views
7

So come trovare e raccogliere un elenco di tutti i controlli utilizzati in un Windows Form. Qualcosa di simile a questo:Trova componenti in una finestra di dialogo C# (non controlli)

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

Tuttavia questa funzione non recupera i componenti non visivi sul fondo della forma come le HelpProvider, ImageList, TableAdapter, set di dati, ecc

C'è un modo per ottenere l'elenco di questi componenti pure?

Edit:

Grazie @HighCore per avermi utilizzare System.ComponentModel.Component invece in una funzione simile mi fa ottenere una lista con componenti quali l'ImageList, il provider Guida e il BindingSource. Tuttavia, mi mancano ancora da questo elenco i TableAdapters ei DataSet. Suppongo perché quelli ereditano direttamente da Object.

Per favore,. Non mi riferire ai post più vecchi che mostrano una funzione simile alla mia e che ottiene solo l'elenco dei controlli.

Modifica: Perché i voti negativi? Questa domanda non ha mai avuto risposta prima!

+0

Non ho familiarità con WinForms, ma se quello che stai cercando sono 'Components' (cioè' System.ComponentModel.Component'), è necessario utilizzare che invece di 'Control'. E per favore cambia questo orribile codice foreach in un bellissimo '.SelectMany()' –

+0

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

+1

Possibile duplicato: [Come accedere a trovare tutti i controlli e tutti i componenti in forma in C#?] (http://stackoverflow.com/questions/6736914/how-to-access-find-all-controls- e-all-components-in-form-in-c) – SwDevMan81

risposta

12

Sorprendentemente, sembra che l'unico modo per farlo sia attraverso la riflessione.

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

Sì, questo è il vincitore. Grazie mille!! –

+1

Scusa, so che questa discussione è vecchia, ma sono sorpreso che questo sia l'unico (e non così intuitivo) modo di ottenere i componenti di un modulo. Grazie Craig per la domanda e Michael per la risposta. Questo mi ha aiutato molto. – nurchi