Benutzer mit den meisten Antworten
Steuerelemente von einem Panel abfragen

Frage
-
Antworten
-
Hallo,
das geht auch. Oder aber:
foreach (CheckBox checkBox in p.Controls.OfType<CheckBox>()) { if (checkBox.Text == "Test") checkBox.Text = "geändert"; }
womit der Filter auf CheckBox(en) bereits im Enumerator erfolgt.
Noch einen Schritt weiter ginge:
var testCheckBoxes = p.Controls.OfType<CheckBox>() .Where(c => c.Text == "Test"); foreach (CheckBox checkBox in testCheckBoxes) checkBox.Text = "geändert";
wobei man den Filter um beliebiges erweitern kann.
(Ich würde allerdings empfehlen, den CheckBoxen Namen zu geben, anstatt die Text-Eigenschaft auszuwerten.)Anstatt p kann man auch panel_list[panelname] einsetzen.
Probiere einfach ein wenig weiter, da ist noch vieles mehr möglich mit LINQ.Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 23. Oktober 2012 07:38
- Als Antwort markiert Ionut DumaModerator Donnerstag, 25. Oktober 2012 11:46
Alle Antworten
-
Hallo,
untergeordnete Steuerelemente findest Du bei Windows Forms - nicht nur bei Panels - in der Controls-Auflistung, siehe auch Control.ControlCollection.
Gruß Elmar
-
Hallo,
Wenn panelname in deinem Code eine Referenz auf eine Zeichenkette ist, die den Schlüssel zum KeyValuePair<String,Panel> darstellt, dann würde ich Elmars richtigen Vorschlag beherzigen: Mit panel_list[panelname].Controls erhältst Du eine Referenz auf die Controls-Auflistung, die jede von Control abgeleitete Klasse besitzt.
Unterscheiden sich jedoch Schlüssel und Panel-Name, d.h. wenn panelname nicht der Schlüssel sondern eben Panel.Name ist, kannst Du über eine LINQ-Abfrage das passende Panel ermitteln:
var foundKeyValuePair = panel_list.Where(kvp => kvp.Value.Name == "Panel2").SingleOrDefault(); if(foundKeyValuePair != null) Panel secondPanel = foundKeyValuePair.Value;
LINQ bietet auch die Möglichkeit an nur bestimmte Steuerelemente zu filtern, z.B.:
var foundPanel = foundKeyValuePair.Value; var allButtonsInPanel = foundPanel.Controls.OfType<TextBox>();
Gruß
Marcel -
Danke erstmals für eure Antwort!
also nach bisschen rumprobieren bin ich auf das gekommen
Panel p = panel_list[panelname];
foreach(Control c in p.Controls) { if(c is CheckBox){ if(c.Text == "Test") c.Text = "geändert"; } }
das müsste ja auch immer gehen? dann habe ich ja quasi nur Zugriff auf die Steuerelemente von diesem Panel.
Gruß trap
- Bearbeitet trap12 Montag, 22. Oktober 2012 06:47
-
Hallo,
das geht auch. Oder aber:
foreach (CheckBox checkBox in p.Controls.OfType<CheckBox>()) { if (checkBox.Text == "Test") checkBox.Text = "geändert"; }
womit der Filter auf CheckBox(en) bereits im Enumerator erfolgt.
Noch einen Schritt weiter ginge:
var testCheckBoxes = p.Controls.OfType<CheckBox>() .Where(c => c.Text == "Test"); foreach (CheckBox checkBox in testCheckBoxes) checkBox.Text = "geändert";
wobei man den Filter um beliebiges erweitern kann.
(Ich würde allerdings empfehlen, den CheckBoxen Namen zu geben, anstatt die Text-Eigenschaft auszuwerten.)Anstatt p kann man auch panel_list[panelname] einsetzen.
Probiere einfach ein wenig weiter, da ist noch vieles mehr möglich mit LINQ.Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 23. Oktober 2012 07:38
- Als Antwort markiert Ionut DumaModerator Donnerstag, 25. Oktober 2012 11:46