Forum: PC-Programmierung Steuerelemente in C# iterieren


von ICh (Gast)


Lesenswert?

Hallo,
folgendes Szenario zu dem mir keine Lösung einfällt. Ich hab eine 
Windowsformsanwendung die einige NumericUpDown und DomainUpDown umfasst.
Die sind zum Beispiel auf dem Tab1 im  (TabControl) so angeordnet:

Numeric0
Numeric1
Domain0
Numeric2
Domain1

Die Werte die jetz da drinnen stehen sollen in ein Array rein.Folgende
schreib weise wollte ich vermeiden(weil irgendwie zu aufwändig):

Array[0]=Numeric0.Value;
Array[1]=Numeric1.Value;
Array[2]=Domain0.SelectedIndex;
Array[3]=Numeric2.Value;
usw...

Gibt es da nicht eine einfachere Lösung mit Foreach oder so.

Zum Beispiel so
Object[] Array=new Array={Numeric0,Numeric1,Domain0,Numeric...}

Wobei bei diesem Ansatz der unterschiedliche 
Typ(NumericUpDown,DomainUpDown)
ein Problem ist

von Markus V. (Gast)


Lesenswert?

Das Problem läßt sich recht einfach lösen:
1
Tabcontrol foo;
2
...
3
foreach ( Control ctrl in foo.controls ) {
4
    ...
5
}
Gruß
Markus

von ICh (Gast)


Lesenswert?

@Markus das mit der foreach Schleife haut hin. Nur wird so über
alles iteriert also auch die Labels die sich in Tabcontrol befinden.

Nach welcher Reihenfolge wird den dann auf die Controls zugegriffen 
gibst
da irgendwo einen Index. Sonst wird mein Array in der Schleife Querbeet 
belegt.

von Markus V. (valvestino)


Lesenswert?

Mir fallen da spontan drei Möglichkeiten ein:

1. Missbrauche den TabIndex deiner Controls um die Reihenfolge 
festzulegen.

2. Jedes Control hat ein Tag-Property (Typ Object). Da kannst Du eine 
beliebige Information dranhängen. Z.B. ein Int32-Objekt, das die 
Reihenfolge Deiner Controls für Deine Verarbeitung wiederspiegelt. Die 
Lösung ist schon etwas besser als den TabIndex zu missbrauchen.

3. Definiere eine Attribut-Klasse, mit der die relevanten Controls 
"markiert" werden. Diese Attribut-Klasse hat ein Index-Property mit dem 
die Verarbeitungsreihenfolge definiert wird. Es werden dann zur Laufzeit 
über Reflection alle mit dem Attribut markierten Controls aufgesammelt, 
sortiert und dann verarbeitet.

Die dritte Lösung ist zugegebenermaßen etwas komplizierter als die 
ersten beiden, hat aber den Vorteil, daß Du keine Abhängigkeiten zu 
Daten hast, die für andere Zwecke verwendet werden (können) und Dir bei 
Änderungen dann vielleicht Deine Verarbeitung zerhauen. Der TabIndex 
z.B. definiert ja die Reihenfolge der Controls beim "Durchtabben" durch 
eine Form.

Gruß
Markus

von Der M. (steinadler)


Lesenswert?

In der foreach-Schleife kannst du dann sogar folgendes machen:
1
foreach(Control ctl in foo.Controls)
2
{
3
 if(ctl is NumericUpDown)
4
 {
5
  array[...] = ((NumericUpDown)ctl).Value;
6
 }
7
 else if(ctl is DomainUpDown)
8
 {
9
  array[...] = ((DomainUpDown)ctl).SelectedIndex;
10
 }
11
}

Du kannst dir auch selbst zwei Klassen bauen, basierend auf den Numeric- 
bzw. Domain-Klassen, welche eine zusätzliche Eigenschaft Index erhalten.

von ICh (Gast)


Lesenswert?

Habs jetzt so gemacht

SteuerElm = new Control[12] { Hier sind alle Controls drin die mich 
intersieren};

Dann der Zugriff:

foreach (Control ctrl in SteuerElm)
            {
               System.Type  typ = ctrl.GetType();

               if (typ == typeof(System.Windows.Forms.NumericUpDown))
               {
               }
               else if (typ==typeof(System.Windows.Forms.DomainUpDown))
               {

               }

            }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.