ListControl Item adden, nur wie?

  • Allgemein

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Füg' mal zwischen Zeile 114 und 115 bei deinem Code folgende Zeile ein

    VB.NET-Quellcode

    1. If e.Index >= 0 AndAlso e.Index < Items.Count Then

    Hätte nicht gedacht, dass man die tatsächlich braucht. Kannst du das Programm einfach mal ausführen und danach danach suchen? Wenn das nicht mehr möglich ist, erzeug mal eine Instanz des Controls per Code, dann siehst du exakt die Zeile, in der die Excption fliegt. Danach suchst du nach dem Grund, warum sie bei dir fliegt und bei uns nicht. Bevor du das Control verwenden kannst, musst du ein Kompilat erstellen, also Debuggen oder Builden. Wär zumindest für mich eine Erklärung, warum der Code anders ist, als im Stacktrace steht.

    Gruß
    ~blaze~

    next one...

    VB.NET-Quellcode

    1. Private Sub ListControl_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem
    2. Dim item As Object = Items(e.Index)
    3. If TypeOf item Is ListControlItem Then ' ist das Item ein ListControlItem (im anderen Code auf eine... interessante Art geloest)
    4. Dim current As ListControlItem = DirectCast(item, ListControlItem) ' Casten zum ListControlItem
    5. If e.Index >= 0 AndAlso e.Index < Items.Count Then
    6. 'Rechteck, in dem gezeichnet werden soll (s. o.)
    7. Dim r As Rectangle = New Rectangle(e.Bounds.X + 1, e.Bounds.Y + 1, e.Bounds.Width - 3, e.Bounds.Height - 2)
    8. With e.Graphics
    9. Dim headerSize As Size
    10. Dim subtextSize As Size
    11. Dim elementBounds As Rectangle
    12. If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then 'ist das Item angewaehlt
    13. .FillRectangle(New SolidBrush(SelectedBackColor), r) 'Hintergrund zeichnen
    14. .DrawRectangle(New Pen(New SolidBrush(SelectedBorderColor)), r) 'Rahmen zeichnen
    15. Else
    16. 'wozu was mit einem durchsichtigen Hintergrund fuellen?!! Wenn dann noch BackColor oder so
    17. '.FillRectangle(New SolidBrush(Color.Transparent), r) 'transparentes Rechteck drueberlegen (lol)
    18. .DrawRectangle(New Pen(New SolidBrush(BorderColor)), r) 'Rahmen zeichnen
    19. End If
    20. If current.Image IsNot Nothing Then 'Wenn ein Bild vorhanden wird (Kotz-Faktor nr 2)
    21. .DrawImage(current.Image, r.X + 5, r.Y + 5, 45, 45)
    22. Else
    23. 'einfach gar nix zeichnen?!!
    24. '.DrawIcon(Drawing.SystemIcons.Error, r.X + 5, r.Y + 5) 'oder halt ein Fehlericon zeichnen
    25. End If
    26. headerSize = Size.Ceiling(.MeasureString(current.Header, HeaderFont)) 'Groesse des Headers ermitteln
    27. elementBounds = New Rectangle(r.X + 60, r.Y + 5, ClientSize.Width - r.X - 60, headerSize.Height) 'Bereich des Headers
    28. 'eigentlich per TextRenderer-Klasse (siehe weiter unten)?
    29. .DrawString(current.Header, HeaderFont, New SolidBrush(HeaderColor), elementBounds) 'Header zeichnen (Top-Text oben)
    30. subtextSize = Size.Ceiling(.MeasureString(current.SubText, SubTextFont)) 'Groesse des Subtexts ermitteln
    31. elementBounds = New Rectangle(r.X + 60, r.Y + 25, ClientSize.Width - r.X - 60, 60 - subtextSize.Height - headerSize.Height)
    32. .DrawString(current.Content, Font, New SolidBrush(Me.ForeColor), elementBounds) 'Inhalt zeichnen (main content oben)
    33. elementBounds = New Rectangle(r.X + 60, r.Y + Me.ItemHeight - 20, Me.Width - r.X - 60, subtextSize.Height)
    34. .DrawString(current.SubText, SubTextFont, New SolidBrush(SubTextColor), elementBounds) 'Subtext zeichnen
    35. 'Falls ausgewaehlt und gewuenscht, ein Fokusrechteck zeichnen
    36. If (e.State And (DrawItemState.Focus Or DrawItemState.NoFocusRect)) = DrawItemState.Focus Then
    37. ControlPaint.DrawFocusRectangle(e.Graphics, r)
    38. End If
    39. End With
    40. ElseIf DrawDefaultItems Then 'von mir eingefuehrte Eigenschaft, die es dem User ermoeglicht, nicht speziell behandelte Items ohne eigene Zeichenprozedur zu zeichnen
    41. e.DrawBackground()
    42. TextRenderer.DrawText(e.Graphics, GetItemText(item), Font, e.Bounds, ForeColor) 'hier ein BSP fuer den TextRenderer
    43. If (e.State And (DrawItemState.Focus Or DrawItemState.NoFocusRect)) = DrawItemState.Focus Then
    44. e.DrawFocusRectangle()
    45. End If
    46. End If
    47. End If

    Drawitem class
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Die Antwort steht genau im Post darüber!

    VB.NET-Quellcode

    1. Private Sub ListControl_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem
    2. If e.Index >= 0 AndAlso e.Index < Items.Count Then
    3. Dim item As Object = Items(e.Index)
    4. If TypeOf item Is ListControlItem Then ' ist das Item ein ListControlItem (im anderen Code auf eine... interessante Art geloest)
    5. Dim current As ListControlItem = DirectCast(item, ListControlItem) ' Casten zum ListControlItem
    6. If e.Index >= 0 AndAlso e.Index < Items.Count Then
    7. 'Rechteck, in dem gezeichnet werden soll (s. o.)
    8. Dim r As Rectangle = New Rectangle(e.Bounds.X + 1, e.Bounds.Y + 1, e.Bounds.Width - 3, e.Bounds.Height - 2)
    9. With e.Graphics
    10. Dim headerSize As Size
    11. Dim subtextSize As Size
    12. Dim elementBounds As Rectangle
    13. If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then 'ist das Item angewaehlt
    14. .FillRectangle(New SolidBrush(SelectedBackColor), r) 'Hintergrund zeichnen
    15. .DrawRectangle(New Pen(New SolidBrush(SelectedBorderColor)), r) 'Rahmen zeichnen
    16. Else
    17. 'wozu was mit einem durchsichtigen Hintergrund fuellen?!! Wenn dann noch BackColor oder so
    18. '.FillRectangle(New SolidBrush(Color.Transparent), r) 'transparentes Rechteck drueberlegen (lol)
    19. .DrawRectangle(New Pen(New SolidBrush(BorderColor)), r) 'Rahmen zeichnen
    20. End If
    21. If current.Image IsNot Nothing Then 'Wenn ein Bild vorhanden wird (Kotz-Faktor nr 2)
    22. .DrawImage(current.Image, r.X + 5, r.Y + 5, 45, 45)
    23. Else
    24. 'einfach gar nix zeichnen?!!
    25. '.DrawIcon(Drawing.SystemIcons.Error, r.X + 5, r.Y + 5) 'oder halt ein Fehlericon zeichnen
    26. End If
    27. headerSize = Size.Ceiling(.MeasureString(current.Header, HeaderFont)) 'Groesse des Headers ermitteln
    28. elementBounds = New Rectangle(r.X + 60, r.Y + 5, ClientSize.Width - r.X - 60, headerSize.Height) 'Bereich des Headers
    29. 'eigentlich per TextRenderer-Klasse (siehe weiter unten)?
    30. .DrawString(current.Header, HeaderFont, New SolidBrush(HeaderColor), elementBounds) 'Header zeichnen (Top-Text oben)
    31. subtextSize = Size.Ceiling(.MeasureString(current.SubText, SubTextFont)) 'Groesse des Subtexts ermitteln
    32. elementBounds = New Rectangle(r.X + 60, r.Y + 25, ClientSize.Width - r.X - 60, 60 - subtextSize.Height - headerSize.Height)
    33. .DrawString(current.Content, Font, New SolidBrush(Me.ForeColor), elementBounds) 'Inhalt zeichnen (main content oben)
    34. elementBounds = New Rectangle(r.X + 60, r.Y + Me.ItemHeight - 20, Me.Width - r.X - 60, subtextSize.Height)
    35. .DrawString(current.SubText, SubTextFont, New SolidBrush(SubTextColor), elementBounds) 'Subtext zeichnen
    36. 'Falls ausgewaehlt und gewuenscht, ein Fokusrechteck zeichnen
    37. If (e.State And (DrawItemState.Focus Or DrawItemState.NoFocusRect)) = DrawItemState.Focus Then
    38. ControlPaint.DrawFocusRectangle(e.Graphics, r)
    39. End If
    40. End With
    41. ElseIf DrawDefaultItems Then 'von mir eingefuehrte Eigenschaft, die es dem User ermoeglicht, nicht speziell behandelte Items ohne eigene Zeichenprozedur zu zeichnen
    42. e.DrawBackground()
    43. TextRenderer.DrawText(e.Graphics, GetItemText(item), Font, e.Bounds, ForeColor) 'hier ein BSP fuer den TextRenderer
    44. If (e.State And (DrawItemState.Focus Or DrawItemState.NoFocusRect)) = DrawItemState.Focus Then
    45. e.DrawFocusRectangle()
    46. End If
    47. End If
    48. End If
    49. End If


    Ich dachte, das würde anders gehandhabt.

    Gruß
    ~blaze~