以下可能是正确的方向。首先,我使用了一些语言扩展方法,例如
Public Module BindingSourceExtensions
<Runtime.CompilerServices.Extension()>
Public Function DataTable(ByVal sender As BindingSource) As DataTable
Return CType(sender.DataSource, DataTable)
End Function
<Runtime.CompilerServices.Extension()>
Public Sub AddCustomer(ByVal sender As BindingSource, ByVal FirstName As String, ByVal LastName As String)
sender.DataTable.Rows.Add(New Object() {Nothing, FirstName, LastName})
End Sub
<Runtime.CompilerServices.Extension()>
Public Function DetachedTable(ByVal sender As BindingSource) As DataTable
Return CType(sender.DataSource, DataTable).GetChanges(DataRowState.Detached)
End Function
<Runtime.CompilerServices.Extension()>
Public Function AddedTable(ByVal sender As BindingSource) As DataTable
Return CType(sender.DataSource, DataTable).GetChanges(DataRowState.Added)
End Function
End Module
现在将 ID、FirstName 和 LastName 加载到 DataTable 中,Datatable 成为 BindingSource 的 DataSource,后者是 BindingNavigator 的 BindingSource,并连接到 DataGridView。
为了简单起见,我模拟了数据,没有断言,例如确保我们有有效的名字和姓氏,而是专注于方法。
首先使用扩展方法向 BindingSource 的底层 DataTable 添加一行。
bsCustomers.AddCustomer("Karen", "Payne")
现在检查是否有分离或添加的行
Dim detachedTable As DataTable = bsCustomers.DetachedTable
If detachedTable IsNot Nothing Then
Console.WriteLine("Has detached")
Else
Console.WriteLine("No detached")
End If
Dim AddedTable As DataTable = bsCustomers.AddedTable
If AddedTable IsNot Nothing Then
Console.WriteLine("Has added")
Else
Console.WriteLine("None added")
End If
由于我们没有与数据库表对话,因此主键没有按预期更新,并且由于您不想更新数据库表,这很好。当然,如果您在项目后期需要,有一种方法可以获取新添加记录的主键。
添加
Private Sub BindingSource1_AddingNew(ByVal sender As System.Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles BindingSource1.AddingNew
Dim drv As DataRowView = DirectCast(BindingSource1.List, DataView).AddNew()
drv.Row.Item(0) = "some value"
e.NewObject = drv
' move to new record
'BindingSource1.MoveLast()
End Sub