[Примечание Обновление:]
Я хочу, чтобы пользователь, добавляющий новую строку в 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 плюс фиктивный база данных. Это очень просто, т.е. без обработки ошибок, но оно показывает ошибку, а также позволяет удалять строки для дополнительного удобства. Спасибо всем, кто заглянет.