如何向绑定源添加新行

时间:2016-08-11 21:43:16

标签: vb.net datarow bindingsource datarowview

我正在尝试以编程方式向绑定源添加新行。我知道调用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

2 个答案:

答案 0 :(得分:1)

以下可能是正确的方向。首先,我使用了一些语言扩展方法,例如

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

答案 1 :(得分:1)

BindingSource AddNew方法实际上并没有向基础数据源添加新记录,它只是将它作为分离项添加到bindingsource。当使用datatabel作为数据源时,我需要获取数据表并使用AddRow()方法 - 这正确地将我的bindingsource中的值设置为添加,以便在将更改提交到bindingsource.Update()方法的数据库时。

我使用的代码:

    Dim drv As DataRowView = DirectCast(bsData.AddNew(), DataRowView)

    drv.BeginEdit()

    drv.Row.BeginEdit()

    drv.Row("IsSelected") = IsChecked

    drv.Row.EndEdit()

    drv.DataView.Table.Rows.Add(drv.Row)

最后一行是将项目实际添加到数据源的内容 - 我误解了BindingSource.AddNew()。