Listbox gefärbte Einträge

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Outsider77.

    Listbox gefärbte Einträge

    Hallo zusammen,

    ich habe eine Listbox auf einer Form, deren Einträge abhängig von einem vorgegebenen Parameter per OnDrawItem farblich hervorgehoben werden. Dabei ist nicht die komplette Reihe der Listbox gemeint, sondern die Schriftfarbe des Eintrages.

    VB.NET-Quellcode

    1. Private Sub OnDrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles ListBox1.DrawItem
    2. Dim Item As Object = ListBox1.Items(e.Index)
    3. Dim Itembegrenzung As Rectangle = e.Bounds
    4. Dim Schriftfarbe As String = "green"
    5. Dim Schriftart As Font = New Font(e.Font, FontStyle.Bold)
    6. Dim Stiftart As New SolidBrush(Color.FromName(Schriftfarbe))
    7. e.Graphics.DrawString(CStr(Item), Schriftart, Stiftart, Itembegrenzung.X, Itembegrenzung.Y)
    8. Stiftart.Dispose()
    9. Schriftart.Dispose()
    10. End Sub


    Meine Frage ist, ob ich beim Auswählen eines Eintrages (ListBox1_SelectedIndexChanged) irgendwie dessen Schriftfarbe ermitteln kann, ohne erneut die Prozedur zu durchlaufen, die es beim Füllen der Listbox eingefärbt hat?
    Vielen Dank schonmal für die Hilfe!

    Gruß Markus
    Die unterschiedlichen Schrift-Farben erfordern unterschiedliche Aktionen nach dem Selektieren, zb das Aktivieren eines bestimmten Tab im TabControl.
    Ich habe das Item jetzt der selben Überprüfung unterzogen, durch welche es seine Schrift-Farbe erhalten hat. Funktioniert natürlich auch. ;)
    Danke vielmals für Deine Hilfe und Inspiration!

    Grüße
    Du könntest für dein Item eine Klasse erstellen, mit den Properties Text und Farbe.
    Class MyListBoxItem

    VB.NET-Quellcode

    1. Public Class MyListBoxItem
    2. Public Text As String
    3. Public ForeColor As Color
    4. Public BackColor As Color
    5. Public Sub New(ByVal name As String, Optional ByVal TextColor As Color = Nothing, Optional ByVal ListbackColor As Color = Nothing)
    6. Text = name
    7. ForeColor = TextColor
    8. BackColor = ListbackColor
    9. End Sub
    10. End Class

    Das DrawItem-Event sieht dann so aus
    DrawItem-Event

    VB.NET-Quellcode

    1. Private Sub OnDrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles ListBox1.DrawItem
    2. Dim lsb As ListBox = CType(sender, ListBox)
    3. lsb.DrawMode = DrawMode.OwnerDrawFixed
    4. e.DrawBackground()
    5. Dim item As MyListBoxItem = TryCast(lsb.Items(e.Index), MyListBoxItem)
    6. ' Get the current item and cast it to MyListBoxItem
    7. If item IsNot Nothing Then
    8. If item.BackColor <> Nothing Then
    9. e.Graphics.FillRectangle(New SolidBrush(item.BackColor), e.Bounds)
    10. End If
    11. Dim myForeBrush As New SolidBrush(lsb.ForeColor)
    12. If item.ForeColor <> Nothing Then
    13. myForeBrush = New SolidBrush(item.ForeColor)
    14. End If
    15. e.Graphics.DrawString(item.Text, lsb.Font, myForeBrush, e.Bounds)
    16. Else
    17. ' The item isn't a MyListBoxItem, do something about it
    18. e.Graphics.DrawString(lsb.Items(e.Index).ToString, lsb.Font, New SolidBrush(lsb.ForeColor), e.Bounds)
    19. End If
    20. e.DrawFocusRectangle()
    21. End Sub

    Das Befüllen machst du dann so
    Listbox füllen

    VB.NET-Quellcode

    1. With ListBox1.Items
    2. .Add(New MyListBoxItem("Hallo"))
    3. .Add(New MyListBoxItem("Welt", Color.Blue))
    4. .Add(New MyListBoxItem("!", Color.Red, Color.Yellow))
    5. End With

    und das Abfragen so
    ListboxItem abfragen

    VB.NET-Quellcode

    1. Private Sub lstCustomers_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    2. Dim MyItem As MyListBoxItem = CType(ListBox1.SelectedItem, MyListBoxItem)
    3. MessageBox.Show("Textfarbe: " + MyItem.ForeColor.ToString() + Environment.NewLine + "Hitergrundfarbe: " + MyItem.BackColor.ToString())
    4. End Sub

    Outsider77 schrieb:

    Die unterschiedlichen Schrift-Farben erfordern unterschiedliche Aktionen nach dem Selektieren
    Falsch.
    Die selben Bedingungen, die zu einer Schriftfarbe führen, führen auch zu den entsprechenden Aktionen, z.B. eine Kombination aus n Flags bzw. Vergleichen.
    Denn:
    Wir trennen Daten und GUI, mit Daten wird gearbeitet, die GUI zeigt Daten nur an und lässt sie bearbeiten.
    Die GUI ist nicht Speicher von Daten-Zuständen!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Du hast natürlich recht, es war auch nicht falsch ausgedrückt von mir, sondern tatsächlich die falsche Herangehensweise.
    Wie ich in Post 5 auch bereits schrieb, habe ich das selektierte Item der selben Prüfung unterzogen, die ihm seine Farbe gegeben hat.
    Trotzdem danke an Dich (und an alle anderen auch), dass ihr meine Sichtweise etwas gerade grückt habt:

    Gruß Markus