Autor Beitrag
ThomAlex
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 58

Windows 7
C# (VS08) Games via XNA (privat) oder WinForms (Schule)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 .

ausblenden C#-Quelltext
1:
class Group1Label : Label					

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 58

Windows 7
C# (VS08) Games via XNA (privat) oder WinForms (Schule)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 12.01.10 18:10 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 58

Windows 7
C# (VS08) Games via XNA (privat) oder WinForms (Schule)
BeitragVerfasst: Di 12.01.10 18:15 
Vielen Dank DanielF:

Das war ein wichtiger Baustein, mit dem ich viel machen kann =)

MFG ThomAlex
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 12.01.10 18:36 
na dann,.. hau rein ;)
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Di 12.01.10 20:46 
Hi,

die Collection könnte eventuell eleganter gefüllt werden.

Hier würden alle Panels einer Form erfasst:
ausblenden 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:
ausblenden 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



BeitragVerfasst: 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:

ausblenden 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
ausblenden C#-Quelltext
1:
foreach (Control ctr1 in panelList.Controls)					

mit
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Fr 19.08.11 07:05 
Meinst du so?

ausblenden 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

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
foreach (Control ctr1 in panelList.Controls)
{
    foreach (Control subCtr in ctr1.Controls)
    {
      DoSomeWhatYouWant...
    }
}

_________________
Gruß
Christoph
uwe1234
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 19.08.11 07:23 
Hallo,

ja so was in der Art meine ich, nur bekomme ich einen Fehler bei
ausblenden C#-Quelltext
1:
foreach (Control ctr1 in panelList.Controls)					


Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 19.08.11 09:46 
uwe1234 hat folgendes geschrieben:
nur bekomme ich einen Fehler bei


Welchen?

Moderiert von user profile iconTh69: C#- durch Quote-Tags ersetzt (sorry, daß ich dich mal korrigieren muß ;-))
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 19.08.11 12:34 
Hallo,

'panelList' ist ja schon selber die Liste, also:
ausblenden C#-Quelltext
1:
2:
3:
foreach (Control ctr1 in panelList)
// bzw.
foreach (Panel panel in panelList)
uwe1234
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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.
ausblenden 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.Controls)
        foreach (Control ctr1 in panelList)
        {
          if (ctr1 is TextBox)
            textboxList.Add(ctr1 as TextBox);
        }

        foreach (var item in textboxList)
        {
          item.BackColor = Color.Red;
        }

      }
    }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Fr 19.08.11 20:27 
Na ja, panelList ist eine Collection die deine Panels enthält. Das .Controls ist somit unsin.

ausblenden C#-Quelltext
1:
foreach (Control ctr1 in panelList)					


oder

ausblenden C#-Quelltext
1:
foreach (Panel panel in panelList)					

_________________
Gruß
Christoph
uwe1234
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 19.08.11 20:51 
Hallo,

ich habe es wie folgt gelöst:
ausblenden 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