Gibt es sowas wie "ItemData" für CheckListBox

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von DHB.

    Gibt es sowas wie "ItemData" für CheckListBox

    Hallo mal wieder,
    mein Problem:
    ich fülle eine CheckListBox mit Werten über eine DataTable aus einer DB
    und möchte den generierten Items einen 2ten Wert zuordnen. Mit…

    VB.NET-Quellcode

    1. For iCt As Integer = 0 To DT.Rows.Count - 1
    2. Dim PName as String = DT.Rows(iCt).Item("PersName").ToString
    3. CheckListBox1.Items.Add(PName)
    4. Dim PID as String = DT.Rows(iCt).Item("PersID").ToString
    5. ' --- Wie kann ich jetzt dem gerade erzeugten Item die PID zuordnen ???
    6. ' --- CheckListBox1. ??? - Kein ItemData, kein SubItem ?(
    7. Next iCt

    Ein adäquates Thema habe ich im Forum nicht gefunden, hoffe aber,
    es kann mir jemand helfen.
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.
    @DHB Wie wäre es mit der .Tag-Property?
    Die ist für genau solch gemacht.
    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!
    probierma statt deiner verlorenen Zeilen diese verlorenen Zeilen:

    VB.NET-Quellcode

    1. CheckListBox1.Items.Clear()
    2. For Each rw in DT.Rows
    3. CheckListBox1.Items.Add(rw)
    4. Next iCt
    5. CheckListBox1.DisplayMember = "PersName"
    6. CheckListBox1.ValueMember = "PersID"
    Ob das überhaupt funktioniert.
    Nicht erschrecken! Das überträgt die Vorgehensweise von Databinding ein Stückweit auf deine ungebundene Listbox.

    Hab ich so noch nie gemacht, aber wenn das funktioniert eröffnen sich reichhaltige Möglichkeiten.
    Weil dann die Listbox nicht nur PersNamen enthält, sondern den ganzen Person-Datensatz, inklusive zb auch der PersID.
    Anzeigen tut sie aber nur PersName.
    @RodFromGermany
    Tscha, wenn's so einfach wär - die Items haben keine Tag-Eigenschaft, diese gibt es nur einmal als Eigenschaft bei der CheckListBox selbst; ich möchte ja quasi einen "Container" bei jedem Item!

    @'ErfinderDesRades
    Ja, so hatte ich es vorher und das funktioniert auch! Allerdings wollte ich aus verschiedenen Gründen keine direkte Bindung der DataTable an die CheckListBox und möchte mich deshalb (wenn es denn eine Lösung gibt) für die oben aufgezeigte Variante umentscheiden.

    Mir fällt gerade ganz dunkel ein:
    Gibt es da nicht etwas, indem man jeweils eine neue Instanz innerhalb der Schleife von …???… generiert und diese dann an das jeweilige Item bindet?
    Ich weiss allerdings nicht mehr, was das ist und wie das geht!
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.

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

    musst dir selber was basteln
    versuchs mal so...

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. Dim items As New List(Of CheckBoxUserItem) From
    5. {New CheckBoxUserItem With
    6. {.DisplayMember = "User1", .ValueMember = 100},
    7. New CheckBoxUserItem With
    8. {.DisplayMember = "User2", .ValueMember = 150},
    9. New CheckBoxUserItem With
    10. {.DisplayMember = "user3", .ValueMember = 300}}
    11. For Each item As CheckBoxUserItem In items
    12. CheckedListBox1.Items.Add(item)
    13. Next
    14. CheckedListBox1.CheckOnClick = True
    15. End Sub
    16. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    17. If CheckedListBox1.CheckedItems.Count > 0 Then
    18. Dim currentValue As Integer = 0
    19. For Each checkedItem As CheckBoxUserItem In CheckedListBox1.CheckedItems
    20. currentValue = MessageBox.Show(checkedItem.ValueMember.ToString)
    21. Next
    22. End If
    23. End Sub
    24. End Class
    25. Public Class CheckBoxUserItem
    26. Public Property DisplayMember As String
    27. Public Property ValueMember As Integer
    28. Public Overrides Function ToString() As String
    29. Return DisplayMember
    30. End Function
    31. End Class

    DHB schrieb:

    die Items haben keine Tag-Eigenschaft
    Jou.
    Wenn Du eine entsprechende Klasse designest, die Du den Items zuweist, kannst Du deren Tag-Property oder eine eigene angepasste Property implementieren, die das tut, was Du brauchst.
    Genau wie von @Kasi vorgeschlagen, nur entsprechend umfangreicher.
    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!
    Jo, ich bin dran! So ähnlich hatte ich es auch in Erinnerung
    - für mich nicht ganz so einfach, aber das krieg ich hin -
    danke erstmal :thumbup:
    mfG DHB

    Ich meine:
    :P Es sollten nur ernstzunehmende Beiträge eingestellt werden!
    :( Beiträge, die nur deren Anzahl in die Höhe treiben sollen, stehlen Lesern deren Zeit und schenken nur Frust.
    ;) Wenn ein Autor sein Thema für erledigt hält, sollte er dies kurz als letzten Eintrag vermerken.
    8) Leser wüssten dann, dass hier weitere Beiträge nicht mehr sinnvoll sind.