自定义集合作为datagridview数据源

时间:2018-09-13 10:48:30

标签: vb.net collections datagridview

我正在学习创建自定义类和集合类。现在要测试我的新近学习的技能,我想在datagridview对象中显示集合类。

如果将集合类设置为datasource,则datagridview中不会填充任何数据。

我的示例包含一个包含某些属性的购买类对象。购买是在一个称为“购买”的收集类中收集的。

datagridview应该向用户显示集合中的所有购买。

下面是我的代码。

Public Class PurchasesEditor

Private Property Purchases As New Purchases

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
    Dim oPurchase As New Purchase
    oPurchase.ID = Purchases.Count + 1
    oPurchase.Description = "Test item"
    oPurchase.Supplier = "Wallmart"
    oPurchase.PurchaseDate = "13/09/2018"
    oPurchase.VAT = 21
    oPurchase.Amount = 100

    Purchases.Add(oPurchase)

    dgvPurchases.DataSource = Purchases

End Sub

End Class

购买集合类     公共类购买

Private PurchaseList As New List(Of Purchase)

Public Sub Add(purchase As Purchase)
    PurchaseList.Add(purchase)
End Sub

Public Function Remove(purchase As Purchase) As Boolean
    Return PurchaseList.Remove(purchase)
End Function

Public Function GetEnumerator() As IEnumerator(Of Purchase)
    Return PurchaseList.GetEnumerator
End Function

Public ReadOnly Property Count() As Integer
    Get
        Return PurchaseList.Count
    End Get
End Property


End Class

购买类别     公共类购买

Public Property ID As Long
Public Property Description As String
Public Property Supplier As String
Public Property PurchaseDate As Date
Public Property Amount As Decimal
Public Property VAT As Double

Public ReadOnly Property VATamount As Decimal
    Get
        Return Amount + Amount * (VAT / 100)
    End Get
End Property


' TODO custom collection
'Public Property AttachedDocuments As List(Of Document)

End Class

1 个答案:

答案 0 :(得分:3)

问题在于您的Purchases类不是集合。它包含一个集合,即您分配给List(Of Purchase)字段的PurchaseList,但是隐藏在其中。 DataGridView不会神奇地获取并显示数据。

至少要使您的类成为列表/集合,它必须实现IEnumerable和/或IEnumerable(Of T)接口。您还可以实现ICollection和/或ICollection(Of T),以扩展先前的接口。您还可以实现IList和/或IList(Of T),从而进一步扩展了先前的接口。为了在绑定到DataGridView时有用,您需要实现IList,并且还应该实现IList(Of T)

如果需要,可以从头开始实现那些接口,但不应该。 System.Collections.ObjectModel.Collection(Of T)类提供了IListIList(Of T)的基本实现,您可以通过继承然后覆盖和/或添加自己的功能来扩展它们。如果您打算专门绑定,则应该继承System.ComponentModel.BindingList(Of T)类,该类继承Collection(Of T)并通过实现IBindingList接口添加特定的绑定支持。如果您还需要过滤功能,则也可以实现IBindingListView接口。

除非您需要特定的自定义功能,否则应坚持使用List(Of T)。但是,如果在数据绑定方案中使用一个,则不会引发UI更新更改所需的事件。在这种情况下,您可以将列表绑定到BindingSource并将其绑定到UI,然后根据需要调用ResetBindings之类的方法来更新UI。

我建议您阅读this了解更多详细信息。