我正在学习创建自定义类和集合类。现在要测试我的新近学习的技能,我想在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
答案 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)
类提供了IList
和IList(Of T)
的基本实现,您可以通过继承然后覆盖和/或添加自己的功能来扩展它们。如果您打算专门绑定,则应该继承System.ComponentModel.BindingList(Of T)
类,该类继承Collection(Of T)
并通过实现IBindingList
接口添加特定的绑定支持。如果您还需要过滤功能,则也可以实现IBindingListView
接口。
除非您需要特定的自定义功能,否则应坚持使用List(Of T)
。但是,如果在数据绑定方案中使用一个,则不会引发UI更新更改所需的事件。在这种情况下,您可以将列表绑定到BindingSource
并将其绑定到UI,然后根据需要调用ResetBindings
之类的方法来更新UI。
我建议您阅读this了解更多详细信息。