Listbox: Multi Select bei gefüllten Objekten

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Listbox: Multi Select bei gefüllten Objekten

    Guten Tag,

    ich habe eine Listbox die ich mit Objekten fülle um eine Anzeige eines Items zu erhalten, dessen Rückgabewert ein anderer ist.
    Die Listbox fülle ich wie folgt:

    VB.NET-Quellcode

    1. Public Sub Listbox_Objects_Fill(ByRef lb As ListBox, ByVal aOb() As Object, ByVal sField As String)
    2. Try
    3. lb.DataSource = Nothing
    4. lb.Items.Clear()
    5. Dim dt As New DataTable
    6. dt.Columns.Add("Display", GetType(String))
    7. dt.Columns.Add("Value", GetType(Object))
    8. If Not aOb Is Nothing Then
    9. For i As Integer = aOb.GetLowerBound(0) To aOb.GetUpperBound(0)
    10. Dim ty As Type = aOb(i).GetType
    11. Dim fis() As System.Reflection.FieldInfo = ty.GetFields()
    12. For Each fi As System.Reflection.FieldInfo In fis
    13. If fi.Name = sField Then
    14. dt.Rows.Add(fi.GetValue(aOb(i)), aOb(i))
    15. Exit For
    16. End If
    17. Next
    18. Next
    19. End If
    20. lb.DataSource = dt
    21. lb.DisplayMember = "Display"
    22. lb.ValueMember = "Value"
    23. Catch ex As Exception
    24. 'Debug
    25. End Try
    26. End Sub

    Der Aufruf sieht dann wie folgt aus...

    VB.NET-Quellcode

    1. Dim aStock() As bxStock_Loc 'Array vom Typ bxStock_loc
    2. Erase aStock
    3. Read_Stock_Loc(gConn, aStock) 'Array wird aus einer Datenbank heraus befüllt
    4. Listbox_Objects_Fill(Listbox1, aStock, "Name") 'Name soll angezeigt werden


    Um zu ermitteln welche Objekte nun selektiert worden sind(rein von der Logik her) reicht folgender Quellcode:

    VB.NET-Quellcode

    1. For Each item As bxStock_Loc In lb.SelectedItems
    2. ID = item.ID
    3. Name = item.Name
    4. Next


    Nun aber möchte ich das diese Listbox mit Werten selektiert wird, die mir vorher bekannt sind.
    Mein Versuch sieht ungefähr so aus:

    VB.NET-Quellcode

    1. 'Die Items durchlaufen
    2. Dim n As Integer = 0
    3. For Each item As bxStock_Loc In lb.Items
    4. 'und mit den zu setzenden vergleichen
    5. If blabla = blabal Then
    6. lb.SetSelected(n, True)
    7. Else
    8. lb.SetSelected(n, False)
    9. End If
    10. n += 1
    11. Next

    In diesem Falle gibt es das Problem bei dem Durchlaufen der For Each Schleife, da lb.items sich nicht zu dem Object konvertieren lässt. Dies aber funktionierte bei "SelectedItems" noch gut.
    Warum ist hier ein Unterschied zwischen .SelectedItems und .Items wo doch beide eine ObjectCollection haben?

    Auch andere Dinge, die ich probiert habe, fanden zu keiner Lösung und im Netz finde ich nichts für MultiSelect bzgl. dieses Problems.
    Mag mir da jemand helfen?

    Ich danke vielmals
    Du benutzt beim iterieren mit For each die implizite Konvertierung von object -> bxStock_Loc, dadurch bekommst Du sofort eine Exception sobald das schiefgeht.

    Sauberer ist folgende Vorgehensweise

    VB.NET-Quellcode

    1. For Each obj As object In lb.Items
    2. ' try to cast without exception
    3. dim item as bxStock_Loc = tryCast(obj,bxStock_Loc)
    4. if item isNot Nothing then
    5. ID = item.ID
    6. Name = item.Name
    7. end if
    8. Next

    Indem Du einen else-Zweig einführst, kannst Du auch rausfinden welches item Probleme bereitet.
    Hallo,
    danke einmal für den Einsatz.

    Das Problem ist, das ich bei jedem Object "Null" nach folgender Anweisung bekomme.

    VB.NET-Quellcode

    1. dim item as bxStock_Loc = tryCast(obj,bxStock_Loc)

    Schaue ich mir das Item im Debug an handelt es sich um "System.Data.DatarRowView" welches natürlich nicht konvertiert werden kann.
    Jetzt bin ich sehr verwundert - denn über ListBox.SelectedValue funktioniert das ganze da ich dort auch das Objekt vom Typ bxStock_Loc erhalte.

    Vielleicht eine Ahnung wie man es hin bekommt?
    Und wenn es nur der ID Wert aus jedem Item ist.
    wenn man an eine DataTable bindet schaltet sich automatisch ein DataView dazwischen.
    Deshalb sind auch keine DataRows in den SelectedItems, sondern DataRowViews.

    Die sind für die hiesigen Zwecke aber ebensogut geeignet. Also Display und Value können dort ebenso abgerufen wern, wie vonne DataRow.
    guckdir DataRowView mal im ObjectBrowser an.