Bei mehreren Labeln die Farbe ändern

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Bei mehreren Labeln die Farbe ändern

    Hallo Forum,

    ich habe mehrere Label auf einer Form. Diese stellen eine Zahl dar. Soweit alles ok. Jetzt soll über eine Abfrage abgefragt werden welche Zahl in dem Label ist und eine entsprechende Hintergundfarbe zugeordnet werden.

    Beispiel:

    2=grün
    4=rot

    usw.

    Das ist kein Problem. Muss ich das für alle Label einzeln machen, oder kann man das eleganter lösen, dass es für alle übernommen wird?
    Du kannst Deine Controls in der Control-Collection durchlaufen:

    Quellcode

    1. For Each c As Control In Me.Controls
    2. If c.GetType.Name = "Label" Then
    3. Select Case c.Text
    4. Case "2" : c.BackColor = Color.Blue
    5. Case "3" : c.BackColor = Color.Green
    6. Case Else
    7. End Select
    8. End If
    9. Next


    Edit: hmpfh, bin heute aber langsam

    Kouki schrieb:

    Mit ner For Each-Schleife alle Controls (Me.Controls) durchlaufen, Text auslesen und Farbe bestimmen ;)

    VB.NET-Quellcode

    1. For Each lbl In Me.Controls
    2. If TypeOf lbl Is Label Then
    3. 'Was du tun willst
    4. End If
    5. Next



    Danke für die schnelle Antwort.

    Ein paar Verständnisfragen:

    Woher weiß das Programm, dass die Labels damit gemeint sind? Ich habe die Labels folgendermaßen beannent:

    lblStat1112
    lblStat1442
    lblStat1331
    lblStat5831
    lblStat0121

    usw. d.h. immer lblStat und eine Nummer.

    Folgenden Quellcode habe ich:

    VB.NET-Quellcode

    1. For Each lbl In Me.Controls
    2. If TypeOf lbl Is Label Then
    3. Select Case lbl.Text
    4. Case "1" : lbl.BackColor = Color.GreenYellow
    5. Case "2" : lbl.BackColor = Color.Green
    6. Case "3" : lbl.BackColor = Color.Orange
    7. Case "4" : lbl.BackColor = Color.Red
    8. Case "5" : lbl.BackColor = Color.Purple
    9. Case "6" : lbl.BackColor = Color.Gray
    10. Case "7" : lbl.BackColor = Color.LightBlue
    11. Case "8" : lbl.BackColor = Color.Beige
    12. Case "9" : lbl.BackColor = Color.Green
    13. End Select
    14. End If
    15. Next


    Keine Fehlermeldung, aber es passiert auch nichts.
    Ganz korrekt müsste der Code so lauten, da die Control-Collection nicht nur aus Labeln besteht, sondern alle Controls die auf der Form sind:

    VB.NET-Quellcode

    1. For Each c As Control In Me.Controls
    2. Debug.Print("Control gefunden: " & c.Name)
    3. If TypeOf c Is Label Then
    4. Dim lbl As Label = DirectCast(c, Label)
    5. Select Case lbl.Text
    6. Case "1" : lbl.BackColor = Color.GreenYellow
    7. Case "2" : lbl.BackColor = Color.Green
    8. Case "3" : lbl.BackColor = Color.Orange
    9. Case "4" : lbl.BackColor = Color.Red
    10. Case "5" : lbl.BackColor = Color.Purple
    11. Case "6" : lbl.BackColor = Color.Gray
    12. Case "7" : lbl.BackColor = Color.LightBlue
    13. Case "8" : lbl.BackColor = Color.Beige
    14. Case "9" : lbl.BackColor = Color.Green
    15. End Select
    16. End If
    17. Next

    Aber daran liegt DeinProblem vermutlich nicht, da alle Controls einen BackColor haben. Der Fehler liegt in Deiner Anwendung.

    Du durchläufst mit dieser Schleife alle GUI-Elemente die in der gleichen Form liegen, in der Du sie ausführst. Wenn das nicht so ist müsste es z.B. Form1.controls heissen.

    Ist der Text der Label wirklich "1", "2","3" usw. ? Hat die GUI Zeit für ein Repaint, sonst müsste ein Application.DoEvents dahinter ?

    Ich habe oben ein Debug.Print reingestellt. Welche Controls findet er ?
    @chris: verwechlse nicht den Namen mit dem Text...

    Zwar ein bißchen OFFTOPIC, aber ich möchte hier kurz die Choose-Funktion erwähnen...

    VB.NET-Quellcode

    1. Dim i As Double = Double.TryParse(lbl.text)
    2. Dim farbe As Color = DirectCast(Choose(i, Color.GreenYellow, Color.Green, _
    3. Color.Orange, Color.Red, Color.Purple, _
    4. Color.Gray, Color.LightBlue, Color.Beige, _
    5. Color.Green), Color)
    6. lbl.backcolor = farbe

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „der_Kurt“ ()

    Kangaroo schrieb:

    Ganz korrekt müsste der Code so lauten, da die Control-Collection nicht nur aus Labeln besteht, sondern alle Controls die auf der Form sind:

    VB.NET-Quellcode

    1. For Each c As Control In Me.Controls
    2. Debug.Print("Control gefunden: " & c.Name)
    3. If TypeOf c Is Label Then
    4. Dim lbl As Label = DirectCast(c, Label)
    5. Select Case lbl.Text
    6. Case "1" : lbl.BackColor = Color.GreenYellow
    7. Case "2" : lbl.BackColor = Color.Green
    8. Case "3" : lbl.BackColor = Color.Orange
    9. Case "4" : lbl.BackColor = Color.Red
    10. Case "5" : lbl.BackColor = Color.Purple
    11. Case "6" : lbl.BackColor = Color.Gray
    12. Case "7" : lbl.BackColor = Color.LightBlue
    13. Case "8" : lbl.BackColor = Color.Beige
    14. Case "9" : lbl.BackColor = Color.Green
    15. End Select
    16. End If
    17. Next

    Aber daran liegt DeinProblem vermutlich nicht, da alle Controls einen BackColor haben. Der Fehler liegt in Deiner Anwendung.

    Du durchläufst mit dieser Schleife alle GUI-Elemente die in der gleichen Form liegen, in der Du sie ausführst. Wenn das nicht so ist müsste es z.B. Form1.controls heissen.

    Ist der Text der Label wirklich "1", "2","3" usw. ? Hat die GUI Zeit für ein Repaint, sonst müsste ein Application.DoEvents dahinter ?

    Ich habe oben ein Debug.Print reingestellt. Welche Controls findet er ?



    Ich habe den Code jetzt mal übernommen. Obwohl ich es eigentlich nicht will. Aber ok :)

    Ich glaube ich habe den eigentlich Fehler gefunden. Die Label befinden sich, bis auf eines, alle in Groupboxen. Und eine Frage ahbe ich noch. Kann ich das auf die Label beschränken, die mit lblStat anfangen? Weil bei den anderen möchte ich nicht, dass sich die Hintergrundfarbe ändert.
    In der For-Each-Schleife eine weitere Bedingung:

    VB.NET-Quellcode

    1. If TypeOf c Is Label AndAlso c.Name.StartsWith("lblStat") Then
    2. ...
    3. End If


    Habs jetzt nicht getestet, aber so müsste es, glaub ich, funktionieren. :D

    EDIT: AndAlso hinzugefügt. :whistling:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB_Gamer“ ()