1

プログラムでバインディング ソースに新しい行を追加しようとしています。bsSource.AddNew() を呼び出すと、DataRowView としてキャストした新しい行が追加され、値が設定されます。私の問題はこれです - DataRowView.Row は分離された RowState を示しています。切り離したくありません。追加されたように表示されるはずです-データベースへの変更をコミットしたくありません(これには非常に正当な理由があります)。その時間は後で決めたいと思います。私のコードは次のとおりです。

private Sub AddToRelationSource(binID As Integer, gradeID As Integer, IsChecked As Boolean)
            Dim drv As DataRowView = DirectCast(bsBinGrades.AddNew(), DataRowView)


            drv.Row("IsSelected") = IsChecked
            drv.Row("BinID") = binID
            drv.Row("GradeID") = gradeID
    ' I tried drv.EmdEdit(0 drv.Row.EndEdit() - Row State still shows detached

End Sub
4

3 に答える 3

2

以下は正しい方向にあるかもしれません。最初に、いくつかの言語拡張メソッドを使用しました。

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
于 2016-08-12T01:05:20.580 に答える