Ich muss alle Steuerelemente in einem Formular vom Typ x erhalten. Ich bin mir ziemlich sicher, dass ich diesen Code in der Vergangenheit einmal gesehen habe, der so etwas verwendet hat:
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))
Ich weiß, dass ich alle Steuerelemente durchlaufen kann, um Kinder mithilfe einer rekursiven Funktion dazu zu bringen, aber gibt es etwas Einfacheres oder Einfacheres, vielleicht das Folgende?
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
Antworten:
Hier ist eine weitere Option für Sie. Ich habe es getestet, indem ich eine Beispielanwendung erstellt habe. Dann habe ich eine GroupBox und eine GroupBox in die ursprüngliche GroupBox eingefügt. In die verschachtelte GroupBox habe ich 3 TextBox-Steuerelemente und eine Schaltfläche eingefügt. Dies ist der Code, den ich verwendet habe (enthält sogar die Rekursion, nach der Sie gesucht haben)
Um es im Formularladeereignis zu testen, wollte ich alle Steuerelemente in der anfänglichen GroupBox zählen
Und es gab jedes Mal die richtige Anzahl zurück, also denke ich, dass dies perfekt für das funktioniert, wonach Sie suchen :)
quelle
In C # (da Sie es als solches markiert haben) können Sie einen LINQ-Ausdruck wie folgt verwenden:
Zur Rekursion bearbeiten:
In diesem Beispiel erstellen Sie zuerst die Liste der Steuerelemente und rufen dann eine Methode zum Auffüllen auf. Da die Methode rekursiv ist, gibt sie die Liste nicht zurück, sondern aktualisiert sie nur.
Es kann möglich sein, dies in einer LINQ-Anweisung mit der
Descendants
Funktion zu tun , obwohl ich damit nicht so vertraut bin. Weitere Informationen hierzu finden Sie auf dieser Seite .Bearbeiten Sie 2, um eine Sammlung zurückzugeben:
Wie @ProfK vorgeschlagen hat, ist eine Methode, die einfach die gewünschten Steuerelemente zurückgibt, wahrscheinlich eine bessere Vorgehensweise. Um dies zu veranschaulichen, habe ich den Code wie folgt geändert:
quelle
Dies ist eine verbesserte Version des rekursiven GetAllControls (), die tatsächlich auf privaten Variablen funktioniert:
quelle
Ich habe einige der vorherigen Ideen zu einer Erweiterungsmethode zusammengefasst. Die Vorteile hierbei sind, dass Sie die korrekt eingegebene Aufzählung zurückerhalten und die Vererbung von korrekt behandelt wird
OfType()
.quelle
Sie können dazu eine LINQ-Abfrage verwenden. Dadurch wird alles in dem Formular abgefragt, das vom Typ TextBox ist
quelle
var c = this.Controls.OfType<TextBox>()
das gleiche Ergebnis erzielen?Es mag die alte Technik sein, aber es funktioniert wie Charme. Ich habe die Rekursion verwendet, um die Farbe aller Beschriftungen des Steuerelements zu ändern. Es funktioniert großartig.
quelle
Ich möchte die Antwort von PsychoCoders ändern: Da der Benutzer alle Steuerelemente eines bestimmten Typs erhalten möchte, können wir Generika folgendermaßen verwenden:
Auf diese Weise können wir die Funktion wie folgt aufrufen:
quelle
.OfType<T>()
Linq-Methode.Where(c => c.GetType() == typeof(T)).Cast<T>();
zu verwenden, als den gleichen Effekt zu erzielen?Vergessen Sie nicht, dass Sie eine TextBox auch in anderen Steuerelementen als Container-Steuerelementen verwenden können. Sie können einer PictureBox sogar eine TextBox hinzufügen.
Sie müssen also auch prüfen, ob
in jeder rekursiven Funktion.
Dies ist das Ergebnis eines Layouts zum Testen dieses Codes:
Versuchen Sie dies mit einer Schaltfläche und einer RichTextBox in einem Formular.
quelle
Reflexion verwenden:
quelle
Hier ist meine Erweiterungsmethode für die
Control
Verwendung von LINQ als Anpassung der @ PsychoCoder- Version:Stattdessen wird eine Liste mit Typen verwendet, mit der Sie nicht mehrere Anrufe benötigen
GetAll
, um das zu erhalten, was Sie möchten. Ich benutze es derzeit als Überlastungsversion.Verwendung:
quelle
Eine saubere und einfache Lösung (C #):
Holen Sie sich alle Textfelder:
quelle
Sie können den folgenden Code verwenden
quelle
Hier ist meine Erweiterungsmethode. Es ist sehr effizient und faul.
Verwendung:
Der Code lautet:
quelle
Hier ist die Lösung.
https://stackoverflow.com/a/19224936/1147352
Ich habe diesen Code geschrieben und nur die Panels ausgewählt, Sie können weitere Schalter oder Wenns hinzufügen. drin
quelle
quelle
Lambda-Ausdrücke
quelle
Ich habe von @PsychoCoder geändert. Alle Steuerelemente konnten jetzt gefunden werden (einschließlich verschachtelt).
quelle
Dies kann funktionieren:
Ich denke, die Funktion zum Abrufen aller Steuerelemente, über die Sie sprechen, steht nur WPF zur Verfügung .
quelle
Hier ist eine getestete und funktionierende generische Lösung:
Ich habe eine große Anzahl von UpDownNumeric-Steuerelementen, einige im Hauptformular, einige in Gruppenfeldern innerhalb des Formulars. Ich möchte, dass nur das zuletzt ausgewählte Steuerelement die Hintergrundfarbe in Grün ändert, für die ich zuerst alle anderen mit dieser Methode auf Weiß gesetzt habe: (kann auch auf Enkelkinder erweitert werden)
quelle
Sie können dies versuchen, wenn Sie wollen :)
quelle
Obwohl mehrere andere Benutzer angemessene Lösungen veröffentlicht haben, möchte ich einen allgemeineren Ansatz veröffentlichen, der möglicherweise nützlicher ist.
Dies basiert weitgehend auf JYeltons Antwort.
quelle
quelle
quelle
Für alle, die nach einer VB-Version von Adams C # -Code suchen, die als Erweiterung der
Control
Klasse geschrieben wurde:HINWEIS: Ich habe
BaseType
Übereinstimmungen für abgeleitete benutzerdefinierte Steuerelemente hinzugefügt . Sie können dies entfernen oder es sogar zu einem optionalen Parameter machen, wenn Sie dies wünschen.Verwendung
quelle
Methode erstellen
Und benutze es wie
quelle
Ich bin saldy mit VB, also habe ich eine Erweiterungsmethode geschrieben. Damit werden alle Kinder und Unterkinder einer Kontrolle abgerufen
Dann können Sie es wie folgt verwenden, wobei "btnList" ein Steuerelement ist
In diesem Fall wird das ausgewählte Optionsfeld ausgewählt.
quelle
Einfach:
quelle