【问题标题】:Bind listbox from a list of object inside an object从对象内的对象列表中绑定列表框
【发布时间】:2014-01-15 09:14:42
【问题描述】:

这里是添加到数据中的 2 个列表(tmp1 和 tmp2)的示例。最终,这个列表框会出现在 DataRepeater 中。

    Dim Data As New List(Of Test)

    Dim item As Test
    item = New Test       

    Dim tmp1 As New List(Of Listing)
    tmp1.Add(New Listing With {.ListingID = "004432", .Name = "Pizza Hut"})
    tmp1.Add(New Listing With {.ListingID = "024235", .Name = "Houston Pizza"})
    item.Listings.AddRange(tmp1)

    Data.Add(item)

    item = New Test

    Dim tmp2 As New List(Of Listing)
    tmp2.Add(New Listing With {.ListingID = "004432", .Name = "Pizza Hut"})
    tmp2.Add(New Listing With {.ListingID = "024235", .Name = "Houston Pizza"})
    item.Listings.AddRange(tmp2)

    Data.Add(item)

    Dim bs As New BindingSource
    bs.DataSource = Data

    ListBox1.DataSource = bs
    ListBox1.DisplayMember = "Listings.Listing.Name" ' I've tried many variations.

我也试过了:

    ListBox1.DataBindings.Add(New Binding("DisplayMember", bs, "Name"))
    ListBox1.DataBindings.Add(New Binding("DisplayMember", Data, "Name"))
    ListBox1.DataBindings.Add(New Binding("Items", bs, "Name"))
    ListBox1.DataBindings.Add(New Binding("Items", Data, "Name"))

我无法在 Google 上找到类似的解决方案。有什么想法吗?

【问题讨论】:

    标签: vb.net winforms data-binding listbox


    【解决方案1】:

    通过复制您的代码,当然还要添加这些类:

    Public Class Test
    
        Public Sub New()
            Me.m_listings = New List(Of Listing)
        End Sub
    
        Public ReadOnly Property Listings() As List(Of Listing)
            Get
                Return Me.m_listings
            End Get
        End Property
    
        Private m_listings As List(Of Listing)
    
    End Class
    
    Public Class Listing
    
        Public Sub New()
            Me.m_listingID = String.Empty
            Me.m_name = String.Empty
        End Sub
    
        Public Property ListingID() As String
            Get
                Return Me.m_listingID
            End Get
            Set(value As String)
                Me.m_listingID = value
            End Set
        End Property
    
        Public Property Name() As String
            Get
                Return Me.m_name
            End Get
            Set(value As String)
                Me.m_name = value
            End Set
        End Property
    
        Private m_listingID As String
        Private m_name As String
    
    End Class
    

    我这样设置列表框:

    Me.ListBox1.DataSource = bs
    Me.ListBox1.DisplayMember = "Listings.Name"
    

    结果是这样的:

    【讨论】:

    • 我注意到的第一个区别是列表的只读属性,这很好。不过有一个怪癖。显示的数据针对每个中继器项目重复。尝试将列表框放在 Datarepeater 中。我尝试粘贴表单的代码,但太长了。
    • @user3140169 m_listings 的实例在 Test 类的整个生命周期中是相同的,这一点很重要。我倾向于声明它Private ReadOnly m_listings As List(Of Listing),所以它只能在构造函数中实例化。 (虽然我在示例中没有这样做)winforms中的DataRepeater?
    【解决方案2】:

    这里的问题是您试图使用嵌套在另一个集合中的集合作为 ListBox 的源,这不起作用。

    从技术上讲,如果你想显示这种类型的关系,那么你需要一个分层的可视化控件,比如树。

    但是,如果您只想显示内部集合(Listings),那么您需要将它们从它们的“父”类(Test)中提取出来并放入它们自己的集合中,然后将该集合绑定到 ListBox。

    如果您以后需要返回父记录,则需要在每个列表记录中存储对它的引用(主键或其他一些唯一标识符)。

    【讨论】:

    • 我想我可以去的另一个方向而不是使用嵌套集合是对主/细节场景友好的表格。感谢您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多