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