Это может быть более фундаментальное изменение, но я думаю, что лучше не использовать DataTables, а вместо этого использовать BindingList. Когда список обновляется, все изменения автоматически отображаются в пользовательском интерфейсе.
Это довольно длинный пример. Используя этот метод, список обновляется из базы данных, но привязка сохраняется, поэтому вы не меняете источник данных в элементе управления.
Базовый класс для данных для реализации INotifyPropertyChanged:
Public Class INotifyBase
Implements INotifyPropertyChanged
Public Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
End Class
В этом примере используется класс с именем User
Public Class User
Public Sub New(userID As Integer, userName As String)
Me.UserName = userName
Me.UserID = userID
End Sub
Public Property UserID As Integer
Public Property UserName As String
End Class
Вот список привязок класса
Public Class MyUsers
Inherits BindingList(Of User)
Public Sub New()
'TODO Add database code to build list
'Example list
Me.Items.Add(New User(1, "Dave"))
Me.Items.Add(New User(2, "John"))
Me.Items.Add(New User(3, "Andrew"))
End Sub
End Class
Создайте класс для привязки к пользовательскому интерфейсу.
Public Class UIBinders
Inherits INotifyBase
Private _users As MyUsers
Property Users As MyUsers
Get
Return _users
End Get
Set(ByVal Value As MyUsers)
If (_users Is Value) Then Return
_users = Value
NotifyPropertyChanged()
End Set
End Property
End Class
Наконец, в форме объявите класс связывателя и привяжите его к сетке. Событие нажатия кнопки загружает данные.
Public Class Form1
Dim Binder As New UIBinders
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
DataGridView1.DataBindings.Add(New Binding("Datasource", Binder, "Users"))
End Sub
Private Sub bnLoadTable_Click(sender As Object, e As EventArgs) Handles bnLoadTable.Click
Binder.Users = New MyUsers
End Sub
End Class
Я понимаю, что это кажется многословным примером, и, возможно, он будет за бортом для вашего первоначального вопроса, но я считаю его полезным, потому что, как только строительные леса на месте, все остальное берет на себя. Также он отделяет пользовательский интерфейс от бизнес-логики.