Пользовательская коллекция как источник данных - PullRequest
0 голосов
/ 13 сентября 2018

Я учусь создавать собственные классы и классы коллекций. Теперь, чтобы проверить свои недавно приобретенные навыки, я бы хотел отобразить класс коллекции в объекте datagridview.

Если я установлю класс сбора как datasource, данные не будут заполнены в 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 голосов
/ 13 сентября 2018

Проблема в том, что ваш 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). Однако если вы используете один из них в сценариях привязки данных, он не вызовет событий, необходимых для обновления пользовательского интерфейса при изменениях. В этом случае вы можете привязать список к BindingSource и привязать его к своему пользовательскому интерфейсу, а затем вызвать методы, такие как ResetBindings, как требуется для обновления пользовательского интерфейса.

Я предлагаю вам прочитать это для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...