Eigenes Controls - Ausgewähltes item, toptext auslesen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Gather.

    Eigenes Controls - Ausgewähltes item, toptext auslesen

    Hallo Community!

    Ich habe folgendes Problem:
    Ich benutze ein eigenes Control - ListControl. Es beinhaltet eine Listbox. Was muss ich Coden um den TopText des ausgewähltem Item auszulesen.

    ListControl
    Code Wurde entfernt. Code im 2. Post (AliveDevil)


    Nochmal, das ListControl hat 3 Textstellen: Toptext, MainContent und SubText. Meine Frage lautet:
    Wie kann ich den Toptext des ausgewähltem Item auslesen?

    Bitte um Hilfe
    Danke im Vorraus.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Gather“ ()

    for all:
    bearbeiteter Code, mit Zeileneinrückungen:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports System.Drawing
    3. Public Class ListControl : Inherits ListBox
    4. Public Shadows Items As IList(Of ListControlItem) ' Dont know if its running
    5. Public Sub New()
    6. Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
    7. Me.ItemHeight = 100
    8. End Sub
    9. Dim _FontSubText As Font = Me.Font
    10. Public Property FontSubText() As Font
    11. Get
    12. Return _FontSubText
    13. End Get
    14. Set(ByVal value As Font)
    15. _FontSubText = value
    16. End Set
    17. End Property
    18. Dim _FontTopText As Font = Me.Font
    19. Public Property FontTopText() As Font
    20. Get
    21. Return _FontTopText
    22. End Get
    23. Set(ByVal value As Font)
    24. _FontTopText = value
    25. End Set
    26. End Property
    27. Dim _SelectedBackColor As Color = Color.CornflowerBlue
    28. Public Property SelectedBackColor() As Color
    29. Get
    30. Return _SelectedBackColor
    31. End Get
    32. Set(ByVal value As Color)
    33. _SelectedBackColor = value
    34. End Set
    35. End Property
    36. Dim _BorderColor As Color = Color.Gray
    37. Public Property BorderColor() As Color
    38. Get
    39. Return _BorderColor
    40. End Get
    41. Set(ByVal value As Color)
    42. _BorderColor = value
    43. End Set
    44. End Property
    45. Dim _SelectedBorderColor As Color = Color.DarkGray
    46. Public Property SelectedBorderColor() As Color
    47. Get
    48. Return _SelectedBorderColor
    49. End Get
    50. Set(ByVal value As Color)
    51. _SelectedBorderColor = value
    52. End Set
    53. End Property
    54. Dim _TopTextForeColor As Color = Color.Black
    55. Public Property TopTextForeColor() As Color
    56. Get
    57. Return _TopTextForeColor
    58. End Get
    59. Set(ByVal value As Color)
    60. _TopTextForeColor = value
    61. End Set
    62. End Property
    63. Dim _SubTextForeColor As Color = Color.Gray
    64. Public Property SubTextForeColor() As Color
    65. Get
    66. Return _SubTextForeColor
    67. End Get
    68. Set(ByVal value As Color)
    69. _SubTextForeColor = value
    70. End Set
    71. End Property
    72. Private Sub ListControl_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem
    73. If e.Index > -1 AndAlso e.Index < (Items.Count) Then
    74. Dim tmp As New ListControlItem(New Bitmap(1, 1), "a", "b", "c")
    75. If Me.Items(e.Index).GetType Is tmp.GetType Then
    76. Dim r As Rectangle = New Rectangle(e.Bounds.X + 1, e.Bounds.Y + 1, e.Bounds.Width - 3, e.Bounds.Height - 2)
    77. tmp = CType(Me.Items(e.Index), ListControlItem)
    78. With e.Graphics
    79. If e.Index = Me.SelectedIndex Then
    80. .FillRectangle(New SolidBrush(SelectedBackColor), r)
    81. .DrawRectangle(New Pen(New SolidBrush(SelectedBorderColor)), r)
    82. Else
    83. .FillRectangle(New SolidBrush(Color.Transparent), r)
    84. .DrawRectangle(New Pen(New SolidBrush(BorderColor)), r)
    85. End If
    86. If tmp.Image IsNot Nothing Then .DrawImage(tmp.Image, r.X + 5, r.Y + 5, 45, 45) Else .DrawIcon(Drawing.SystemIcons.Error, r.X + 5, r.Y + 5)
    87. .DrawString(tmp.TopText, Me.FontTopText, New SolidBrush(TopTextForeColor), New Rectangle(r.X + 60, r.Y + 5, Me.Width - (r.X + 60), CInt(.MeasureString(tmp.TopText, Me.FontTopText).Height)))
    88. .DrawString(tmp.MainContent, Me.Font, New SolidBrush(Me.ForeColor), New Rectangle(r.X + 60, r.Y + 25, Me.Width - (r.X + 60), CInt(60 - .MeasureString(tmp.TopText, Me.FontTopText).Height - .MeasureString(tmp.SubText, Me.FontSubText).Height)))
    89. .DrawString(tmp.SubText, Me.FontSubText, New SolidBrush(SubTextForeColor), New Rectangle(r.X + 60, r.Y + Me.ItemHeight - 20, Me.Width - (r.X + 60), CInt(.MeasureString(tmp.SubText, Me.FontSubText).Height)))
    90. End With
    91. End If
    92. End If
    93. End Sub
    94. Private Sub ListControl_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SelectedIndexChanged
    95. Me.Invalidate()
    96. End Sub
    97. End Class
    98. Public Class ListControlItem
    99. Public Sub New(ByVal _IMG As Bitmap, ByVal _TopText As String, ByVal _mainCont As String, ByVal _SubText As String)
    100. If Image IsNot Nothing Then Image = _IMG
    101. TopText = _TopText
    102. SubText = _SubText
    103. MainContent = _mainCont
    104. End Sub
    105. Public Image As Bitmap = New Bitmap(1, 1)
    106. Public TopText As String = ""
    107. Public MainContent As String = ""
    108. Public SubText As String = ""
    109. End Class

    Gather: Ich habe einfach Eiskalt die Items-Eigenschaft mit Shadows überschrieben. Musst du mal gucken, obs das ist, was du willst, wenn nicht, kann ich mich nochmal mehr mit dem Code beschäftigen ( denn diese Uhrzeit ist nicht wirklich Arbeitsfördernd^^ )
    wäre nett wenn du dir das nochmal anschaust denn es geht nicht, wenn ich das Control auf die Formziehe und vergrößern will:
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    ...zeile 83

    VB.NET-Quellcode

    1. If e.Index > -1 AndAlso e.Index < (Items.Count) Then
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Items.Count
    (glaub ich)

    Und wie soll ich das dann fixxen?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Items.Count ist die Property eines Objektes.
    Die Fehlermeldung sagt aber, dass ein Objekt Nothing ist.
    Und dass das ein Problem ist.

    Bleibt nurnoch Items als der Bösewicht.

    Und ist doch auch logisch, dasses ein Problem ist, wenn Items Nothing ist - wie soll dann Items.Count abgerufen werden?

    das ist wie wenn du einen Arbeiter anschnautzt, dasser schnellermachen soll - dabei isser garnicht erst zum dienst erschienen ;)

    Also mußt du ein Items-Objekt erschaffen - dazu ist das Schlüsselwort New da. AliveDevil hat die Zeile angezeigt, wo man Items nicht nur als List(Of ListControlItem) deklarieren sollte, sondern auch gleich eine neu erschaffene List(Of ListControlItem) zuweisen.

    Also deklarieren und initialisieren in einer Zeile!
    Danke dir erstmal, leider war ich schon soweit, doch man darf ja auf einer Schnittstelle kein New verwenden:


    Was tun? Wie kann ich es anderst deklarieren? Bitte um erläuterung.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Danke jetzt funktioniert das, aber wie kann ich jez den TopText des ausgewählten item auslesen?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    ---Kann entfernt werden--- hat sich erledigt.

    Post bitte entfernen.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Das war ja meine Frage von anfang an:
    Wie kann ich den Toptext des ausgewähltem Item auslesen?
    Muss ich da eine Property erstellen? Oder sontiges.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Dein Programm:

    VB.NET-Quellcode

    1. Dim text As String = bla.TopText


    Die ListControlitem-Klasse:

    VB.NET-Quellcode

    1. Private TopText_ As String
    2. Public Property TopText As String
    3. Get
    4. Return TopText_
    5. End Get
    6. Set(ByVal value As String)
    7. TopText_ = value
    8. End Set
    9. End Property


    Solltest du aber eigentlich können.
    Ja, das hilft mir aber leider nicht weiter, die Property TopText benötigt man um ein Item zum ListControl zu adden.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!