Laden...

[erledigt] Hierachische Erfassung von Controls auf einer Form

Erstellt von Kampfkartoffel vor 14 Jahren Letzter Beitrag vor 14 Jahren 932 Views
K
Kampfkartoffel Themenstarter:in
21 Beiträge seit 2006
vor 14 Jahren
[erledigt] Hierachische Erfassung von Controls auf einer Form

Hallo an Alle,

folgender Fall:
Ich möchte gerne alle meine Controls auf einer Form durchgehen, typorientiert sortieren, in ein Array eintragen und dann über das Array in einer "For each"-Schleife bestimmten Controltypen einen Eventhandler zuordnen.
Ich habe eine Funktion geschrieben, die sich für jede Untergruppierung von Controls (wenn z.B. Buttons in einer Groupbox auf der Form sind) selbst wieder aufruft, um alle Hierachiestufen durchzugehen. Das klappt auch alles wunderbar. Ich speichere mir die Namen der Objekte und will damit später mein Array füllen über

ControlArray(I)=OpenForm("Formname").Controls("Aktueller Controlname")

Mein Problem ist nun folgendes:
Wenn ich einen Button namens "Button5" habe, der in einer Groupbox "GroupBox1" ist, dann habe ich als Bezeichnung nur "Button5". Mein Programm findet dann den Button nicht, weil er in einer Unterebene angeordnet ist. Muss ich mir nun wirklich einen Algorithmus überlegen, der für jede Unterstufe die jeweiligen Controls aufruft, Beispiel:

ControlArray(I)=OpenForm("Formname").Controls("GroupBox1").Controls("Button5")

oder geht das auch irgendwie einfacher, wenn ich weiss, das beispielsweise der Button "Button5" in der Groupbox "Groupbox1" liegt?

Vielen Dank für Denkanstöße
KK

Es reicht nicht nur keine Meinung zu haben, man muss auch unfähig sein sie auszudrücken

N
335 Beiträge seit 2006
vor 14 Jahren

Hallo Kampfkartoffel,

Control[] results = Controls.Find("ButtonX", true);
if (results.Length == 1 && results[0] is Button)
{
    Button btn = results[0] as Button;
    // Tu was damit
}

Control.ControlCollection.Find-Methode

Mfg NeuroCoder

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo Kampfkartoffel,

die ControlCollection besitzt die Erweiterungsmethode OfType<T> (von IEnumerable geerbt). Mit dieser können einfach die Controls abgefragt werden.

zB


private void button1_Click(object sender, EventArgs e)
{
    IEnumerable<Button> buttons = this.Controls.OfType<Button>;
}

Dabei musst du berücksichtigen dass bei geschachtelten Controls die "Kinder" nicht zurückgegeben werden. Dazu wäre Rekursion nötig (oder die Stack-Variante anstatt der Rekursion).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

K
Kampfkartoffel Themenstarter:in
21 Beiträge seit 2006
vor 14 Jahren

Hallo NeuroCoder und gfoidl,

danke für die Antworten. Das hört sich alles vielversprechend und tatsächlich einfacher an als mein ursprüngliches Vorhaben. Ich werde es heute implementieren.

Gruß
KK

Es reicht nicht nur keine Meinung zu haben, man muss auch unfähig sein sie auszudrücken

5.299 Beiträge seit 2008
vor 14 Jahren

Ich speichere mir die Namen der Objekte und will damit später mein Array füllen

Namen speichern kann Probs machen, weil in UserControls derselbe Name auch nochmal vorkommen kann.
Warum speicherst du nicht die Objekte selber?

Der frühe Apfel fängt den Wurm.

K
Kampfkartoffel Themenstarter:in
21 Beiträge seit 2006
vor 14 Jahren

Kurze Rückmeldung,

mit eurer Hilfe funktioniert nun alles ohne Probleme und tut genau das, was ich möchte, danke nochmal.

@NeuroCoder
Ja, das wäre in der Tat besser, ich hatte jedoch Probleme bei der Parameterübergabe in meinen Funktionen und da ich für die kleine Anwendung, in der ich es benutze, sicherstellen kann, dass keine Controls denselben Namen haben, wollte ich erstmal einen Lösungsweg beschreiten der funktioniert. Das Ganze dann in Deinem Sinne zu perfektionieren ist der nächste Schritt.

Gruß
KK

Es reicht nicht nur keine Meinung zu haben, man muss auch unfähig sein sie auszudrücken