Listbox bei der jedes item eine andere Hintergrundfarbe hat

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Listbox bei der jedes item eine andere Hintergrundfarbe hat

    Hey Leute,
    An für sich erklärt sich der Titel ja selbst. Dazu hätte ich gerne, dass die Farbe aus den Items, die als Text RGB Codes haben, extrahiert wird. Geht das?
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Hier scheint es einen Lösungsweg zu geben. Kannst da ja mal rein schauen.
    ListBox Item Color (ungleichmäßig) einstellen
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Toni03 Im Ernstfakll nimmst Du ein DataGridView, da geht das problemlos.
    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!
    Ein DataGridView nutzt mir dabei leider nicht viel. Das von mrMo klappt leider nicht.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down

    Toni03 schrieb:

    Ein DataGridView nutzt mir dabei leider nicht viel.
    Warum (nicht)?
    Was ist der Plan?
    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!
    Ich habe vor ein Programm zu schreiben mit dem man die Farben auf dem Bildschirm auslesen kann und die dann in einer Listbox gespeichert werden. In der Listbox soll dann als Hintergrundfarbe des jeweiligen Items festgelegt werden. Bei einem Doppelklick soll man auch dazu noch die Farbe ändern können.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    Und was kann da ne ListBox, was ein DGV nicht kann?
    Was funktioniert an dem Link von mrMo nicht? Nur zur Sicherheit: Du kommst da bei diesem Post raus. Und in schön umgeschrieben, kommt das dabei raus:
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Toni03 schrieb:

    Das von mrMo klappt leider nicht.

    Was klappt nicht? Copy&Paste? Das hier schaut doch recht vielversprechend aus:

    T1g0r schrieb:


    Um die Hintergrundfarbe zu ändern kannst du z.B diesen Code nutzen:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. With ListBox1.Items
    3. For i As Integer = 1 To 100
    4. .Add("Eintrag " & i.ToString)
    5. Next
    6. End With
    7. ' Wir möchten uns um die Ausgabe der Einträge selbst kümmern
    8. ListBox1.DrawMode = DrawMode.OwnerDrawFixed
    9. End Sub
    10. Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
    11. ' ListBox-Eintrag
    12. Dim sItem As String = ListBox1.Items(e.Index)
    13. ' Hintergrundfarbe
    14. If (e.State And DrawItemState.HotLight) Or (e.State And DrawItemState.Selected) Then
    15. ' wenn Eintrag selektiert, Standard-Hintergrundfarbe für
    16. ' den Selektionsbalken verwenden
    17. e.DrawBackground()
    18. Else
    19. ' wenn Eintrag nicht selektiert, abwechselnde Hintergrundfarbe
    20. Dim nColor As Color = IIf(e.Index Mod 2 = 0, Color.Yellow, Color.White)
    21. e.Graphics.FillRectangle(New SolidBrush(nColor), e.Bounds)
    22. End If
    23. ' Text ausgeben
    24. e.Graphics.DrawString(sItem, e.Font, New SolidBrush(e.ForeColor), e.Bounds.X, e.Bounds.Y)
    25. End Sub



    p.s Mit nem DataGridView geht sowas übrigens auch. Das Grid kann man auch so einstellen, das es nahezu wie ne Listbox aussieht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Gut, dass Funktioniert schon mal. Habe jetzt aber noch die Frage wie ich den Hintergrund anhand des item Textes festlegen kann. Der Text ist ja auch ein Argb Code.
    if Brain.Enabled = False Then
    Process.start("C:\Brain.exe")
    End if
    __________________________________________________

    Error: Brain.exe not found System shut down
    BackColor vs ForeColor siehe siehe die Funktion InvColor

    Freundliche Grüsse

    exc-jdbi

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. Private colors()() As Color
    5. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    6. With ListBox1.Items
    7. For i As Integer = 1 To 300
    8. .Add("Eintrag " & i.ToString)
    9. Next
    10. End With
    11. Me.ListBox1.DrawMode = DrawMode.OwnerDrawFixed
    12. Me.colors = Me.GetColorPair
    13. End Sub
    14. Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles ListBox1.DrawItem
    15. Dim sItem As String = Me.ListBox1.Items(e.Index).ToString
    16. Dim forecolor = Me.colors(e.Index Mod Me.colors.Length)(1)
    17. Dim backgroundcolor = Me.colors(e.Index Mod Me.colors.Length)(0)
    18. If (e.State And DrawItemState.HotLight) = DrawItemState.HotLight OrElse _
    19. (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
    20. e.DrawBackground()
    21. Else : e.Graphics.FillRectangle(New SolidBrush(backgroundcolor), e.Bounds)
    22. End If
    23. e.Graphics.DrawString(sItem, e.Font, New SolidBrush(forecolor), e.Bounds.X, e.Bounds.Y)
    24. End Sub
    25. Private Function InvColor(ByVal c As Color) As Color
    26. Dim basis As Int32 = (255 \ 3) * 2
    27. Return Color.FromArgb(Math.Abs(basis - c.R), Math.Abs(basis - c.G), Math.Abs(basis - c.B))
    28. End Function
    29. Private Function GetColorPair() As Color()()
    30. Dim c = Me.GetColors
    31. Return c.Select(Function(cc) {cc, Me.InvColor(cc)}).ToArray
    32. End Function
    33. Private Function GetColors() As Color()
    34. Return [Enum].GetValues(GetType(KnownColor)) _
    35. .Cast(Of KnownColor)() _
    36. .Select(Function(k) Color.FromKnownColor(k)).ToArray
    37. End Function
    38. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()