www.mikrocontroller.net

Forum: PC-Programmierung Steuerelemente in C# iterieren


Autor: ICh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus V. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem läßt sich recht einfach lösen:
Tabcontrol foo;
...
foreach ( Control ctrl in foo.controls ) {
    ...
}
Gruß
Markus

Autor: ICh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der foreach-Schleife kannst du dann sogar folgendes machen:
foreach(Control ctl in foo.Controls)
{
 if(ctl is NumericUpDown)
 {
  array[...] = ((NumericUpDown)ctl).Value;
 }
 else if(ctl is DomainUpDown)
 {
  array[...] = ((DomainUpDown)ctl).SelectedIndex;
 }
}

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

Autor: ICh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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))
               {

               }

            }

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.