2017-12-18 1 views
-1

Ich möchte alle Steuerelemente in meinem Formular finden, die eine bestimmte Schnittstelle implementieren (sagen wir ITestInterface). Ich habe dies versucht:Wie findet man ein Steuerelement des Typs in der gesamten Steuerungskette?

this.Controls.OfType<ITestInterface>(); 

aber es GOE ist nur eine Ebene tiefer (ungeachtet dessen, was in MSDN geschrieben - @dasblinkenlight), also wenn zum Beispiel habe ich eine Platte in Form und eine ITestInterface Steuerung innerhalb des Panels es wird es nicht finden.

Wie geht das?


Edit: Wie @HansPassant in einem Kommentar schrieb, konnte ich hart Code meine Platten Namen, aber ich brauche eine allgemeine Lösung, und nicht um eine spezifische Lösung für eine bestimmte Form.

+1

Hinweis: Rekursion verwenden. (Control.Controls/Control.Parent) –

+0

Betrachten Sie panel1.Controls anstelle von this.Controls –

+0

@HansPassant - Ich brauche die Lösung allgemein und nicht spezifisch für ein bestimmtes Formular. – Sipo

Antwort

2

Sie haben Rekursion verwenden und die Controls Eigenschaft der Steuerelemente für Schritt durch:

private IEnumerable<T> GetAllOfType<T>(Control rootControl) 
{ 
    return rootControl.Controls.OfType<T>(). 
      Concat(rootControl.Controls.OfType<Control>().SelectMany(GetAllOfType<T>)); 

} 

diese Weise können Sie wie:

var allOfTestInterface = GetAllOfType<ITestInterface(this); 

Es nimmt alle Bedienelemente mit dieser Schnittstelle, die direkt enthalten sind, durch das root-Steuerelement (mit Ihrem OfType<>() Aufruf) und ruft dann die Methode erneut für alle Steuerelemente von diesem Steuerelement enthalten, so rekursiv durch alle Container. flacht diese verschachtelten Listen zu einer Liste zusammen.

+1

@dasblinkenlight Ja, die Formulierung ist ziemlich vage, sie sagen nicht wirklich, dass verschachtelte Controls enthalten sind, sie sagen, dass man "Controls" verwenden kann, um alle Steuerelemente eines Formulars zu durchlaufen, einschließlich verschachtelter Controls gleich ;) –

Verwandte Themen