Entwickler-Ecke

C# - Die Sprache - Inhalt eines Strings als Label-Objekt dereferenzieren?


remarque - Mi 22.08.07 14:21
Titel: Inhalt eines Strings als Label-Objekt dereferenzieren?
Hallo,

ich möchte in einem String einen Bezeichner für ein Label zusammenbauen, abhängig von Zählvariablen.
Da ich in meinem Programm sehr viele Labels verwende, sind deren Bezeichner durchnummeriert. In einer Methode sollen
für bestimmte Labels die Eigenschaft "BackColor" geändert werden. Ich hatte gehofft, es durch eine Dereferenzierung einer Stringvariable lösen zu können. Leider gibt es aber in Zeile 18 zu einem Compiler-Fehler: "Der *-Operator oder der ->-Operator muss auf einen Zeiger angewendet werden."

Was mache ich falsch?

Habe noch nicht soviel Erfahrung mit C#, dieses Programm ist quasi Learning by doing :-)


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private void Vergleichen()
{
    // Ziehungs-Matrix mit Tip-Matrix vergleichen
    string lblname = "";
    for (int i = 0; i < matrix_tip.GetLength(0); i++)
        for (int j = 0; j < this.matrix_tip.GetLength(1); j++)
        {
            if (this.matrix_tip[i, j] + this.matrix_zie[j] == 2)
            {
                if (j <= 9)
                {
                    lblname = "this.lblTip" + Convert.ToString(i + 1) + "_0" + Convert.ToString(j+1) + ".BackColor";
                }
                else
                {
                    lblname = "this.lblTip" + Convert.ToString(i + 1) + "_" + Convert.ToString(j+1) + ".BackColor";
                }
                *lblname = System.Drawing.Color.GreenYellow;
            }
        }
}


JüTho - Mi 22.08.07 14:41

Hallo,

meine Anregung ist unvollständig, weil ein bestimmtes Control nicht unmittelbar nach dem Namen gefunden werden kann, sondern u.U. eine rekursive Suchfunktion nötig ist. Unter der Voraussetzung, dass alle Labels auf demselben ContainerControl (z.B. Panel) liegen, geht das wie folgt:

Dein Hauptfehler ist, dass Du Labelname + Eigenschaft als string verarbeiten willst. Dein Ziel muss sein, ein bestimmtes Control anhand seines Namens zu finden:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void ChangeColor(int i, int j) {
string lblname = String.Format("lblTip{0}_{1}", i+1, j+1);
foreach(Control ctrl in MyPanel.Controls) {
    if (ctrl is Label && ctrl.Name == lblname) {
        (ctrl as Label).BackColor = System.Drawing.Color.GreenYellow; 
        break;
    }
}

Weitere Fehler: this ist eine Kurzbezeichnung für die aktuelle Klasse; es gehört nicht zum Namen des Elements. Gleiches gilt für die Eigenschaft BackColor. Außerdem ist für die Zusammensetzung eines solchen Strings die String.Format()-Methode besser.

Wenn die Labels auf verschiedenen Containern liegen, musst Du sie rekursiv durchlaufen.

Grundsätzlich musst Du Dir merken, zwischen den Typen und Eigenschaften genau zu unterscheiden. Jürgen

PS. Bitte markiere Quellcode: oben auf "Bereiche" klicken, den Code markieren, dann auf das Plus neben C# klicken. Das kannst Du auch jetzt nachholen, indem Du Deinen Beitrag änderst.


remarque - Mi 22.08.07 14:49

Vielen Dank für die schnelle und hilfreiche Antwort!


remarque - Mi 22.08.07 15:39

Habe deinen Lösungsvorschlag umgesetzt und es funktioniert bestens.

Die Suche nach den Controls mittels "Foreach" ist ja sehr elegant. Gefällt mir sehr gut.

Nochmals vielen Dank!!

Gruß Markus