Ein Steuerelement auf einem Winforms mit LINQ finden?

8

Ich versuche, einen eleganten Weg zu finden, um Steuerelemente für ein Formular für Windows Forms zu erhalten. Zum Beispiel:

%Vor%

Aber das muss sicherstellen, dass es alle Steuerelemente rekursiv durchläuft.

Was ist die eleganteste Art dies zu implementieren mit LINQ ?

    
Joan Venge 07.01.2010, 23:59
quelle

4 Antworten

8

LINQ ist nicht unbedingt für die Rekursion mit unbekannter Tiefe am besten geeignet. benutze einfach normalen Code ...

%Vor%

mit:

%Vor%

Oder wenn Sie die obige Rekursion nicht mögen:

%Vor%     
Marc Gravell 08.01.2010, 00:06
quelle
13

"Eleganter" Kontrollfilter (kein LINQ)

Dank C # 3 gibt es viele elegante Lösungen. Dieser verwendet keine LINQ-Abfrageoperatoren. Es verwendet Lambdas und Delegaten.

Dies filtert alle Steuerelemente nach bestimmten Kriterien (kann nach mehreren Kriterien filtern). Gibt mehrere Übereinstimmungen zurück. Es ermöglicht mehr als die Namenserkennung.

%Vor%

Filternutzung ...

Es ist ziemlich flexibel, was die Nutzung angeht

%Vor%

Äquivalente Erweiterungsmethode

Extension-Methoden fügen auch Anwendungen einen Erbe der Eleganz hinzu.

Die genau gleiche Logik kann in eine Erweiterungsmethode wie diese injiziert werden.

%Vor%

Erweiterung Verwendung ist:

%Vor%

Eine weitere Erweiterung für die Rückgabe eines Steuerelements oder null

Ruft die erste Erweiterungsmethode (siehe oben) auf, um alle übereinstimmenden Steuerelemente zu erhalten, und gibt dann das erste in den Übereinstimmungen zurück, andernfalls null, wenn die Übereinstimmungsliste leer ist.

Dies ist nicht effizient, weil es über alle Kontrollen iteriert, auch nachdem das erste Spiel gefunden wurde - aber nur um SO Kommentare herumspielen.

%Vor%     
John K 08.01.2010 02:50
quelle
7

Ich denke nicht, dass Sie rekursive Linq-Abfragen direkt erstellen können, aber Sie könnten eine rekursive Methode mit linq:

erstellen %Vor%

Dies sollte eine Sequenz zurückgeben, die jedes in einer Kontrollhierarchie enthaltene Steuerelement enthält. Dann ist es einfach, eine Übereinstimmung zu finden:

%Vor%

Ich persönlich würde Linq auf diese Weise vermeiden.

    
Lee 08.01.2010 00:18
quelle
1

Nicht so einfach ...

LINQ ist nicht sehr gut in Rekursion und Control.Controls ist nicht LINQ aktiviert (benötigt Cast).

Manchmal ist eine Methode die beste Lösung. Da Sie eine schreiben können, die für alle Controls funktioniert, ist sie sogar noch mehr als eine LINQ-Abfrage wiederverwendbar. Es könnte eine Erweiterungsmethode sein.

    
Henk Holterman 08.01.2010 00:09
quelle

Tags und Links