Entwickler-Ecke

C# - Die Sprache - Variabler Variablenname


P584 - Mi 21.07.10 15:58
Titel: Variabler Variablenname
Nächstes Problem. Und sorry, mir ist kein blöderer Titel eingefallen :D

Also ich hab folgendes mir ausgedacht:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
   string converter1 = "";
            string converter2 = "";
            string converter3 = "";
            string converter4 = "";
            string converter5 = "";
            string converter6 = "";
            string converter7 = "";
            string converter8 = "";
            string converter9 = "";
            string converter10 = "";
            string converter11 = "";
            string converter12 = "";
            string converter13 = "";
            string converter14 = "";
            string converter15 = "";
            string converter16 = "";
            string converter17 = "";

            for (int i = 1; i > 10; i++)
            {if (cbb_[i].SelectedItem.ToString() == "lol")
            { converter[i] = "laughing out loud"; }
            }


ich habe 17 comboboxen (cbb_1 bis cbb_17). Bei denen kann man unter anderem "lol" auswählen. Wenn dann beispielsweise bei cbb_5 "lol" ausgewählt wird, soll eine Variable converter5 den Wert "laughing out loud" annehmen.

Soweit, hoffe ich, verständlich.

1. Wie kann ich das dann individuell prüfen, ohne für jede Combobox eine eigene if-Abfrage zu nehmen? Ich hab mir gedacht, ich mache das so, wie oben im Code gezeigt wird. Nur weiß ich nicht, wie eine Variable bzw. die jeweilige Combobox einen individuellen Namen annehmen kann. [i] ist schon mal falsch^^. Es soll nur aufzeigen, wie ich mir das gedacht habe

2. Gibts theroetisch eine noch einfachere Lösung für meine oben genannte Aufgabenstellung?


danielf - Mi 21.07.10 16:13

Hallo,

du kannst eine Collection (z.B. Liste) von Strings nehmen. Die Collection muss unterstützen, dass sie auf ihre Element per Index zugreifen kannst (was die List macht).

Dementsprechend würdest du es so machen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
// Liste (von strings) erstellen
List<string> converter = new List<string>();

// Liste füllen (evtl. mit einer Schleife)
converter.Add("");
converter.Add("");
converter.Add("");
...


// speichern
converter[i] = "laughing out loud";


Gruß


P584 - Mi 21.07.10 17:15

Und was ist dann mit der Combobox? Weil die jeweilige cbb hängt ja mit dem jeweiligen string zusammen.

wenn bei cbb_14 dies und das steht, dann nimmt converter14 einen bestimmten Wert an.

Aber das mit der List klappt immerhin schonmal *THUMBS UP*, nur geht mein Vorhaben halt nicht, wenn die cbb da nicht mitzieht^^


Ralf Jansen - Mi 21.07.10 17:23

So wie du deine strings in einer List<string> halten kannst, kannst du genauso deine Comboboxen in einer List<Combobox> halten und dann per Index darauf zugreifen.


P584 - Mi 21.07.10 17:47

Ok. Aber die Comboboxen existieren ja im Gegensatz zu den Variablen "converter" bereits. Darüber hinaus wird mit den cbb's weiter oben im Quelltext schon gearbeitet.

Wie schreibe ich es dann?


Flitzs - Mi 21.07.10 18:06

Ich nehme an, dass du die Comboboxen via Designer (also mittles Drag&Drop) erstellt hast.

Wenn du dir die Designer Datei (<FormName>.Designer.cs) ansieht wirst du merken, dass der Designer alle Controls automatisch einer Collection namens this.Controls hinzufügt.

Diese Collection kannst du jetzt auf ein bestimmtes Control durchsuchen. z.B. so:


C#-Quelltext
1:
this.Controls.Find("cbb_1",false).First()                    


Das liefert dir das Control mit dem Namen "cbb_1".


mfg Flitzs


P584 - Mi 21.07.10 18:15

Hmm... und was bringt mir das dann in meinem konkreten Fall? Könntest du evtl. etwas mehr Code liefern, wie ich das handhaben muss, um das von mir gewünschte zu erreichen =) ?


Flitzs - Mi 21.07.10 19:09

user profile iconP584 hat folgendes geschrieben Zum zitierten Posting springen:
Hmm... und was bringt mir das dann in meinem konkreten Fall? Könntest du evtl. etwas mehr Code liefern, wie ich das handhaben muss, um das von mir gewünschte zu erreichen =) ?


Damit kannst du in einer Schleife auf die Comboboxen zugreifen.
Ungefähr so könnte dein Problem gelöst werden:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            int totalBoxes = 17;
            string boxesPrefix = "cbb_";
            string[] converters = new string[totalBoxes];

            for (int i = 0; i < totalBoxes; ++i)
            {
                var cbox = this.Controls.Find(boxesPrefix + (i + 1).ToString(), false).First() as ComboBox;
                //Vergleichen des Textes und zuweisen des Converters
            }


lg Flitzs


P584 - Mi 21.07.10 20:02

Danke erstmal @Flitzs

..jedoch:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
            int totalBoxes = 17;
            string boxesPrefix = "cbb_";
            string[] converter = new string[totalBoxes];

            for (int i = 0; i < totalBoxes; ++i)
            {
                var cbox = this.Controls.Find(boxesPrefix + (i + 1).ToString(), false).First() as ComboBox;
                if (cbb_[i].SelectedItem.ToString() == "lol")
            { converter[i] = "laughing out loud"; }
            }

            tb_ausgabe.Text = converter1 + converter2 + converter3;


funktioniert nicht... die Ausgabe hab ich gemacht um zu überprüfen ob das klappt, aber die Variablen "sind im aktuellen Kontext nicht vorhanden". Ja, ich gebe zu, dass ich nicht mehr durchblicke :D


Flitzs - Mi 21.07.10 20:09

Wir haben die einzelnen Variablen doch durch ein Array ersetzt, daher greifst du nun über das Array auf die einzelnen Werte zu.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
            int totalBoxes = 17;
            string boxesPrefix = "cbb_";
            string[] converter = new string[totalBoxes];

            for (int i = 0; i < totalBoxes; ++i)
            {
               var cbox = this.Controls.Find(boxesPrefix + (i + 1).ToString(), false).First() as ComboBox;                
                if(cbox.SelectedItem != null)
                    if(cbox.SelectedItem.ToString() == "lol")
                        converter[i] = "laughing out loud"
            }
            tb_ausgabe.Text = converter[0] + converter[1] + converter[2];


P584 - Mi 21.07.10 20:38

Heureka :-D:-D

funzt jetzt alles, besten Dank.

...man sieht sich in nicht all zu langer Zeit mit dem nächsten Problem xD