Entwickler-Ecke
WinForms - Schneller Zugriff auf Steuerelemente
ThomAlex - Di 12.01.10 17:34
Titel: Schneller Zugriff auf Steuerelemente
Hallo an alle,
Ich möchte gerne wissen, wie man in C# mit Schleifen z.B auf eine Menge von Steuerelementen zugreigt. Beispielsweise habe ich in meiner Form 30 Panels auf schwarz und möchte die Farbe in rot ändern. Ich könnte alle Panels einzeln ansprechen und rot zuweisen, das ist aber zeitaufwendig und nicht grad elegant. Wie greife ich auf eine Anzahl von Panels zu?
Ps: Bin Programmierneuling
MFG Thomalex
danielf - Di 12.01.10 17:54
Hallo,
eine Form hat die Eigenschaft Controls, in dem du auf jedes Control zugreifen kannst und dementsprechend ändern kannst.
Da du wahrscheinlich nicht die Farbe alle Controls, sondern nur einer gewissen "Gruppe" ändern möchtest, kannst du die zusammengehörige Controls in eine Liste von Controls packen und dann über diese iterieren.
Alternativ kannst du auch über ableiten eigene Klassen der Controls erstellen und so mit is überprüfen "zu welcher Gruppe" das Control gehört .
C#-Quelltext
1:
| class Group1Label : Label |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| foreach(var item in this.Controls) { if (item is Group1) { item.BackColor = Color.Red } } |
Mfg Daniel
ThomAlex - Di 12.01.10 18:06
Dankeschön.
Aber könntest du mir zeigen wie es geht?
Also ich habe 5 Panels(pnl1,pnl2,pnl3,pnl4,pnl5) und möchte mit Controls die Farbe ändern, wie sieht in etwa der Code aus?
Ja ich habe es selbst versucht nur wiegesagt ich versuche mich auch gerade einzuarbeiten, wäre nett wenn du mir schreibst wie es geht.
Danke schonmal
MFG ThomAlex
danielf - Di 12.01.10 18:10
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| List<Panels> activePanels = new List<Panels>();
activePanels.Add(pnl1); activePanels.Add(pnl2); activePanels.Add(pnl3); activePanels.Add(pnl4); activePanels.Add(pnl5);
...
foreach(var item in activePanels) { item.BackColor = Color.Red; } |
???
ThomAlex - Di 12.01.10 18:15
Vielen Dank DanielF:
Das war ein wichtiger Baustein, mit dem ich viel machen kann =)
MFG ThomAlex
danielf - Di 12.01.10 18:36
na dann,.. hau rein ;)
Christoph1972 - Di 12.01.10 20:46
Hi,
die Collection könnte eventuell eleganter gefüllt werden.
Hier würden alle Panels einer Form erfasst:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| List<Panel> panelList = new List<Panel>() ; foreach (Control ctr in this.Controls) { if (ctr is Panel) panelList.Add(ctr as Panel); } |
Man kann aber auch Controls innerhalb eines anderen Controls erfassen:
C#-Quelltext
1: 2: 3: 4: 5:
| foreach (Control ctr in FrameX.Controls) { if (ctr is Panel) panelList.Add(ctr as Panel); } |
uwe1234 - Fr 19.08.11 00:02
Hallo zusammen,
ich hänge mich mal an den Thread ran, da ich noch eine tiefergründige Nachfrage habe.
Soweit habe ich das verstanden, wie setzte ich aber folgendes Problem um:
Ich würde gerne alle TextBoxen in allen Panels auf einen rutsch ändern.
Ich habe 3 Panels (panel1...panel3) und je Panel 12 TextBoxen.
Ich habe folgendes versucht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| List<Panel> panelList = new List<Panel>(); foreach (Control ctr in this.Controls) { if (ctr is Panel) panelList.Add(ctr as Panel); }
List<TextBox> textboxList = new List<TextBox>(); foreach (Control ctr1 in panelList.Controls) { if (ctr1 is TextBox) textboxList.Add(ctr1 as TextBox); }
foreach (var item in textboxList) { item.BackColor = Color.Red; } |
Ich fange gerade C# an, bitte Nachsehen bei "einfache" Fehlern.
Ersetze ich die Zeile
C#-Quelltext
1:
| foreach (Control ctr1 in panelList.Controls) |
mit
C#-Quelltext
1:
| foreach (Control ctr1 in panel1.Controls) |
bekomme ich alle TextBoxen im panel1 geändert. Einfachste Idee wäre das ganze 3x hintereinander mit panel2 und panel3, nur denke ich das dies keine gute Lösung ist.
Für eine Idee wäre ich dankbar.
Gruß Uwe
Christoph1972 - Fr 19.08.11 07:05
Meinst du so?
C#-Quelltext
1: 2: 3:
| foreach (Control ctr1 in panelList.Controls) foreach (Control subCtr in ctr1.Controls) DoSomeWhatYouWant... |
das Selbe nur in Klammern, zum Verständnis
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| foreach (Control ctr1 in panelList.Controls) { foreach (Control subCtr in ctr1.Controls) { DoSomeWhatYouWant... } } |
uwe1234 - Fr 19.08.11 07:23
Hallo,
ja so was in der Art meine ich, nur bekomme ich einen Fehler bei
C#-Quelltext
1:
| foreach (Control ctr1 in panelList.Controls) |
Gruß
Ralf Jansen - Fr 19.08.11 09:46
uwe1234 hat folgendes geschrieben: |
nur bekomme ich einen Fehler bei |
Welchen?
Moderiert von
Th69: C#- durch Quote-Tags ersetzt (sorry, daß ich dich mal korrigieren muß ;-))
Th69 - Fr 19.08.11 12:34
Hallo,
'panelList' ist ja schon selber die Liste, also:
C#-Quelltext
1: 2: 3:
| foreach (Control ctr1 in panelList) foreach (Panel panel in panelList) |
uwe1234 - Fr 19.08.11 15:05
Hallo,
ja Ok das habe ich gerade getestet und durch den debugger gelasen. In der PanelList werden auch alle aufgeführt,
nur muss ich ja jetzt eine Ebene tiefer um die Controls innerhalb der einzelnen Panels aufzulisten, um die
TextBoxen, die sich innerhalb der Panels sind, zu finden. Da hänge ich im Moment.
Anbei den Code den ich getestet habe.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| private void cbSetup_CheckedChanged(object sender, EventArgs e) {
if (cbSetup.Checked == true) {
List<Panel> panelList = new List<Panel>(); foreach (Control ctr in this.Controls) { if (ctr is Panel) panelList.Add(ctr as Panel); }
List<TextBox> textboxList = new List<TextBox>(); foreach (Control ctr1 in panelList) { if (ctr1 is TextBox) textboxList.Add(ctr1 as TextBox); }
foreach (var item in textboxList) { item.BackColor = Color.Red; }
} } |
Th69 - Fr 19.08.11 16:15
Hallo uwe1234,
die Antwort hat Christoph1972 dir doch schon gegeben - du benötigst zwei ineinander verschachtelte Schleifen (du möchtest ja von jedem Panel alle TextBoxen durchlaufen).
P.S: Auf das "as Panel" bei der Add-Methode kann man verzichten (da Add jedes beliebige Control annimmt).
uwe1234 - Fr 19.08.11 19:51
Hallo,
das habe ich auch schon übernommen und versucht. Leider bekomme ich eine Fehlermeldung im Visual Studio 2010 Express.
Visual Studio meckert bei der Zeile
C#-Quelltext
1:
| foreach (Control ctr1 in panelList.Controls) |
mit folgender Meldung
Zitat: |
"System.Collections.Generic.List<System.Windows.Forms.Panel>" enthält keine Definition für "Controls", und es konnte keine Erweiterungsmethode "Controls" gefunden werden, die ein erstes Argument vom Typ "System.Collections.Generic.List<System.Windows.Forms.Panel>" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) |
Christoph1972 - Fr 19.08.11 20:27
Na ja, panelList ist eine Collection die deine Panels enthält. Das .Controls ist somit unsin.
C#-Quelltext
1:
| foreach (Control ctr1 in panelList) |
oder
C#-Quelltext
1:
| foreach (Panel panel in panelList) |
uwe1234 - Fr 19.08.11 20:51
Hallo,
ich habe es wie folgt gelöst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| if (cbSetup.Checked == true) { foreach (Control ctr in this.Controls) { if (ctr is Panel) { foreach (Control ctr1 in ctr.Controls) { if (ctr1 is TextBox) { ctr1.BackColor = Color.Red; } } } } } |
Danke für die Hilfe und die Hinweise.
Gruß Uwe
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!