Проблема в том, что ваш 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
, как требуется для обновления пользовательского интерфейса.
Я предлагаю вам прочитать это для более подробной информации.