Autor |
Beitrag |
ThomAlex
      
Beiträge: 58
Windows 7
C# (VS08) Games via XNA (privat) oder WinForms (Schule)
|
Verfasst: Di 12.01.10 17:34
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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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 
      
Beiträge: 58
Windows 7
C# (VS08) Games via XNA (privat) oder WinForms (Schule)
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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 
      
Beiträge: 58
Windows 7
C# (VS08) Games via XNA (privat) oder WinForms (Schule)
|
Verfasst: Di 12.01.10 18:15
Vielen Dank DanielF:
Das war ein wichtiger Baustein, mit dem ich viel machen kann =)
MFG ThomAlex
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Di 12.01.10 18:36
na dann,.. hau rein 
|
|
Christoph1972
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: 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); } |
_________________ Gruß
Christoph
|
|
uwe1234
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Fr 19.08.11 07:05
_________________ Gruß
Christoph
|
|
uwe1234
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Fr 19.08.11 20:27
_________________ Gruß
Christoph
|
|
uwe1234
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
|
|