[注意更新:]
我希望向 datagridview (DGV) 添加新行的用户能够在 Access 数据库中创建该行,并能够创建多行并对这些新行进行非同步编辑。DGV 由数据集表填充,我发现在 DGV 和数据库之间设置数据集是最佳实践(或至少允许灵活性)。
要对多个用户创建的新行进行编辑,数据集需要能够从数据库中检索自增主键,然后用新行的更新键值重新填充 DGV。或者至少这是我发现完成这项工作的唯一方法。问题是,当我尝试向数据表添加一行时,它最终会生成三行而不是一行。
[为简洁起见,删除了旧帖子]
以下是 DGV 第一次被填充并绑定到数据集的方式:
Dim ConMain As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MasterPath)
Dim ds As New DataSet
Public Sub UniversalFiller(ByVal QueryStringFill As String, ByVal DGV As DataGridView, ByVal AccessDBTableName As String)
If IsNothing(ds.Tables(AccessDBTableName)) Then
Else
ds.Tables(AccessDBTableName).Clear()
End If
ConMain.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MasterPath
Dim daZZ As New OleDbDataAdapter(QueryStringFill, ConMain)
Try
daZZ.Fill(ds, AccessDBTableName)
DGV.DataSource = ds
DGV.DataMember = AccessDBTableName
DGV.AutoResizeColumns()
Catch ex As Exception
WriteToErrorLog(ex.Message, ex.StackTrace, ex.GetHashCode, ex.Source, ex.ToString)
ds.Clear
MsgBox("There was an error filling the DGV, ds.cleared") 'this is for my notes, not user error'
End Try
End Sub
更新:
我仍然无法弄清楚这个问题。这在处理时调用DGV.UserAddedRow
。 我了解到原始代码可能不是仅添加 1 行的最佳方法,但即使制作新行也会遇到同样的问题:
Dim daZZ As New OleDbDataAdapter(DBSelectQuery, ConMain)
Dim CurrentCellPoint As Point = DGV.CurrentCellAddress
Dim CurrentCellText As String = DGV.CurrentCell.Value.ToString
Dim cmdBldr As New OleDbCommandBuilder(daZZ)
cmdBldr.QuotePrefix = "["
cmdBldr.QuoteSuffix = "]"
MsgBox("1")
Dim DaZZDataRow As DataRow = ds.Tables(DTName).NewRow
MsgBox("2")
DaZZDataRow(CurrentCellPoint.X) = CurrentCellText
MsgBox("3")
ds.Tables(DTName).Rows.Add(DaZZDataRow)
MsgBox("4")
daZZ.InsertCommand = cmdBldr.GetInsertCommand()
MsgBox("5")
daZZ.Update(ds.Tables(DTName))
MsgBox("6")
ds.Tables(DTName).Clear()
daZZ.Fill(ds, DTName)
MsgBox("5")
daZZ.Update(ds.Tables(DTName))
DGV.CurrentCell = DGV(CurrentCellPoint.X, CurrentCellPoint.Y)
问题始终是ds.Tables(DTName).Rows.Add()
步骤。括号中的内容无关紧要.Add()
。它可以是数字或任何包含 0 的整数,它将组成 3 行。它不会被多次调用。只需调用ds.Tables(DTName).Rows.Add()
.
如果这不是添加一个空白行的正确方法,那是什么?我可以发布 SQL 插入/更新命令,但这不是问题,因为添加是创建三行,而不是 1。要明确的是,它只会遍历MsgBox
项目一次并产生 3 行。
我也很好奇, InsertAt 命令产生相同的结果:
ds.Tables(DTName).Rows.InsertAt(DaZZDataRow, CurrentCellPoint.Y)
而不是ds.Tables(DTName).Rows.Add()
仍然产生 3 个新行。我也在 Access 的一个新的暂存数据库上尝试过这个并遇到同样的问题。
这是代码的工作示例,作为 VS2012 项目加上虚拟数据库。它非常简单,即没有错误处理,但它显示错误并且还允许删除行以增加便利。感谢任何看的人。