以下は正しい方向にあるかもしれません。最初に、いくつかの言語拡張メソッドを使用しました。
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 は BindingNavigator の BindingSource である BindingSource の DataSource になり、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