Liste binden und DisplayMember

  • VB.NET

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

    Liste binden und DisplayMember

    Huhu
    ich habe schon gesucht aber leider nichts passendes gefunden.
    Ich binde eine Liste an eine Listbox und mit DisplayMember kann man die Propertys auswählen, die angezeigt werden sollen.
    Was ist aber wenn die ausgewählte Property selbst eine Klasse ist und ich davon die Property haben möchte.

    Bisher hab ich das so gelöst.

    VB.NET-Quellcode

    1. Dim kList As New List(Of Integer)
    2. For Each a In Maschine.Aufträge
    3. kList.Add(a.AuftragA.Auftragsnummer)
    4. Next
    5. ListBox1.DataSource = kList


    So funktioniert es leider nicht.

    VB.NET-Quellcode

    1. ListBox1.DataSource = Maschine.Aufträge
    2. ListBox1.DisplayMember = "AuftragA.Auftragsnummer"


    MFG vico
    In Arbeit...
    Mag sein, dass es anders auch geht. Ich würd es so lösen.... Einfach in der Klasse Auftrag die .ToString() Funktion überschreiben....

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim list As New List(Of Maschine)
    4. Dim a As New Auftrag(1234565)
    5. Dim m As New Maschine(a)
    6. Dim a1 As New Auftrag(309503)
    7. Dim m1 As New Maschine(a1)
    8. list.AddRange({m, m1})
    9. Me.ListBox1.DataSource = list
    10. Me.ListBox1.DisplayMember = "Auftrag"
    11. End Sub
    12. End Class
    13. Public Class Maschine
    14. Public Property Auftrag As Auftrag
    15. Public Sub New(auftrag As Auftrag)
    16. Me.Auftrag = auftrag
    17. End Sub
    18. End Class
    19. Public Class Auftrag
    20. Public Property Auftragsnummer As Integer
    21. Public Sub New(auftragsNummer As Integer)
    22. Me.Auftragsnummer = auftragsNummer
    23. End Sub
    24. Public Overrides Function ToString() As String
    25. Return Me.Auftragsnummer.ToString()
    26. End Function
    27. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    How to turn OPTION STRICT ON
    Why OPTION STRICT ON
    Was auch noch geht ist, dass Du das Format-Event der ListBox nutzt und hier entsprechend eingreifst....

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim list As New List(Of Maschine)
    4. Dim a As New Auftrag(1234565)
    5. Dim m As New Maschine(a)
    6. Dim a1 As New Auftrag(309503)
    7. Dim m1 As New Maschine(a1)
    8. list.AddRange({m, m1})
    9. Me.ListBox1.DataSource = list
    10. End Sub
    11. Private Sub ListBox1_Format(sender As Object, e As ListControlConvertEventArgs) Handles ListBox1.Format
    12. Dim x As Maschine = DirectCast(e.ListItem, Maschine)
    13. e.Value = x.Auftrag.Auftragsnummer.ToString()
    14. End Sub
    15. End Class
    16. Public Class Maschine
    17. Public Property Auftrag As Auftrag
    18. Public Sub New(auftrag As Auftrag)
    19. Me.Auftrag = auftrag
    20. End Sub
    21. End Class
    22. Public Class Auftrag
    23. Public Property Auftragsnummer As Integer
    24. Public Sub New(auftragsNummer As Integer)
    25. Me.Auftragsnummer = auftragsNummer
    26. End Sub
    27. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    How to turn OPTION STRICT ON
    Why OPTION STRICT ON
    Man hat also 2 Klassen. Maschine (bei mir Machine) und Auftrag (Order). Jede Maschine hat x Aufträge. In einer 1. ListBox stehen die Maschinen, in einer 2. die Aufträge der gewählten Maschine. Dann ergibt sich bei mir unter Verwendung 2er BindingSources:

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private MachineList As New ComponentModel.BindingList(Of Machine)
    3. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. MachineBindingSource.DataSource = MachineList
    5. End Sub
    6. Private Sub BtnCreateTestData_Click(sender As Object, e As EventArgs) Handles BtnCreateTestData.Click 'nur Befüllung; keine Relevanz für die Funktionalität
    7. MachineList.Add(New Machine With {.Name = "A"})
    8. MachineList.Last.OrderList.Add(New Order With {.ID = "a1"})
    9. MachineList.Add(New Machine With {.Name = "B"})
    10. MachineList.Last.OrderList.Add(New Order With {.ID = "b1"})
    11. MachineList.Last.OrderList.Add(New Order With {.ID = "b2"})
    12. MachineList.Add(New Machine With {.Name = "C"})
    13. MachineList.Last.OrderList.Add(New Order With {.ID = "c1"})
    14. MachineList.Last.OrderList.Add(New Order With {.ID = "c2"})
    15. MachineList.Last.OrderList.Add(New Order With {.ID = "c3"})
    16. End Sub
    17. End Class
    18. Public Class Machine
    19. Public Property Name As String
    20. Public Property OrderList As New ComponentModel.BindingList(Of Order)
    21. End Class
    22. Public Class Order
    23. Public Property ID As String
    24. End Class
    Bilder
    • AtRuntime.png

      13,47 kB, 1.142×331, 12 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.