Listboxeintrag formatieren

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    Listboxeintrag formatieren

    Hallo Zusammen,

    ich habe auf einer Windows-Form eine Listbox, welche über ein Dataset gefüllt wird. Diese Listbox hat immer folgenden Inhalt:

    Datum Freitext
    Datum Freitext
    Datum Freitext
    .
    .
    .


    Gibt es irgendeine Möglichkeit, das ich hier das Datum irgendwie hervorheben kann, z.B. das Datum in jeder Zeile Fett darstellen oder andere Farbe, wie ist mir eigentlich relativ egal.
    Ich hätte mir es so vorgestellt, dass bis zum ersten leer Zeichen alles hervorgeben werden soll oder eine bestimmte Anzahl von Zeichen.

    Ich weiß, das dies mit einer ListView oder Datagridview deutlich einfacher wäre. Ich will jedoch das funktionierende Projekt nicht großartig ändern und möchte deshalt wenn es irgendwie geht die Listox beibehalten.
    Habe mal was versucht, es funktioniert sogar. Schön ist anders und da gibt es deutlich bessere Vorgehensweisen! Du wolltest es aber Quick&Dirty, hier hast du xD

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class spezialListbox
    2. Inherits ListBox
    3. Public Sub New()
    4. Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
    5. End Sub
    6. Protected Overrides Sub OnDrawItem(e As System.Windows.Forms.DrawItemEventArgs)
    7. Dim istSpezialZeile As Boolean = False
    8. If e.Index >= 0 AndAlso e.Index < Items.Count Then
    9. 'Prüft ob das erste "Wort" ein Datum ist
    10. Dim str As String = Items(e.Index).ToString
    11. Dim arr() As String = str.Split(" "c)
    12. Dim vlltDatum As String = ""
    13. If arr.Count >= 1 Then
    14. vlltDatum = arr(0)
    15. If Date.TryParse(vlltDatum, Nothing) Then
    16. istSpezialZeile = True 'Das erste Wort ist ein Datum, SpezialZeichenModus ON
    17. End If
    18. End If
    19. If istSpezialZeile Then
    20. Dim rest As String = ""
    21. For i = 1 To arr.Count - 1
    22. rest &= arr(i)
    23. Next
    24. Dim sizeDate As SizeF = e.Graphics.MeasureString(vlltDatum & "_", New Font(Font, FontStyle.Bold))
    25. Dim colorText As Color = getForeColor(e.State)
    26. e.DrawBackground()
    27. e.DrawFocusRectangle()
    28. e.Graphics.DrawString(vlltDatum, New Font(Font, FontStyle.Bold), New SolidBrush(colorText), e.Bounds.X, e.Bounds.Y)
    29. e.Graphics.DrawString(rest, Font, New SolidBrush(colorText), e.Bounds.X + sizeDate.Width, e.Bounds.Y)
    30. Else
    31. Dim colorText As Color = getForeColor(e.State)
    32. If (e.State And System.Windows.Forms.DrawItemState.Selected) = System.Windows.Forms.DrawItemState.Selected Then colorText = Color.White
    33. e.DrawBackground()
    34. e.DrawFocusRectangle()
    35. e.Graphics.DrawString(str, Font, New SolidBrush(colorText), e.Bounds.X, e.Bounds.Y)
    36. End If
    37. End If
    38. MyBase.OnDrawItem(e) 'wer weiß was da so passiert
    39. End Sub
    40. Private Function getForeColor(ByVal state As System.Windows.Forms.DrawItemState) As Color
    41. Dim selectedColor As Color = Color.White
    42. If (state And System.Windows.Forms.DrawItemState.Selected) = System.Windows.Forms.DrawItemState.Selected Then Return selectedColor
    43. 'vllt weitere fälle...
    44. 'ansonsten:
    45. Return ForeColor
    46. End Function
    47. End Class







    Kritik ist erwünscht, vllt gibts elegantere Wege?
    Erfinder hat ja eigentlich recht, jedoch will ich wie gesagt nicht mehr viel ändern, weil das Projekt jetzt endlich so läuft wie es soll und es sich nur noch um die Formatierung handelt. Einie derartige Änderung stellt mich bestimmt wieder vor irgendwelchen anderen Problemen.

    Ich möchte den Vorschlag von FreakJNS gerne umsetzen schaffe es aber leider nicht. Ich habe meinem Projekt eine Klasse hinzugefügt, dort den Code reinkopiert und in der gewünschten Form im Load-Event speziallistbox hinzugefügt. Leider passiert da gar nichts. Irgendetwas mache ich wieder falsch. Könnte mir nochmal kurz jemand helfen bitte.

    toeller schrieb:

    und in der gewünschten Form im Load-Event speziallistbox hinzugefügt. Leider passiert da gar nichts.

    FreakJNS hat da eine SpezialListbox gecodet, die - wenn du mal guckst - von Listbox erbt.
    Also nach kompilieren sollteste die Speziallistbox in deiner Toolbox haben wie alle anneren Controls auch.
    Und dann gehört das Teil ausse Toolbox aufs Form gezogen, nicht im FormLoad geadded (zu was denn geadded?).

    Also FreakJNS Idee ist sicherlich, dass diese SpezialListbox deine bisherige Listbox ersetzen soll.

    nochn Tipp: Immer schön Backup machen bei so Umbauten ;)
    Ja, das war so geacht, dass du die Listboxen per Designer durch die SpezialListboxen austauschst. Wo wir ja schon bei Quick&Dirty sind, hier wäre Quick&Dirty²³

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Dim dd() As String = "10.10.12 asdf|adsf|04.12.1991|932342 lasdfjlk".Split("|"c)
    3. ListBox1 = listboxErstetzen(ListBox1)'Ersetzt Listbox1 durch eine spezialListbox
    4. ListBox1.DataSource = dd
    5. End Sub
    6. Function listboxErstetzen(ByVal lb As ListBox) As spezialListbox
    7. Dim tmp As New spezialListbox
    8. tmp.Location = lb.Location
    9. tmp.DataSource = lb.DataSource
    10. tmp.Size = lb.Size
    11. tmp.Parent = Me
    12. lb.Hide()
    13. tmp.Show()
    14. Return tmp
    15. End Function


    Aber ganz ehrlich: Entweder richtig machen oder seinlassen. Sowas ist als bastelei vllt ganz nett um zu sehen was man da alles deichseln kann (bin grade selbst überrascht) aber für den realen Einsatz in einem Programm wäre mir das alles zu wischiwaschi. Die alten Listboxen schwirren btw noch in Me.Controls rum, die müsstest du dann auch noch rausfischen - und ich denke spätestens da gibts Probleme (doppelt gefeuerte Events, die Listboxen lassen sich nicht löschen etc)