[追記:]
私の望みは、新しい行を datagridview (DGV) に追加するユーザーが、その行を Access データベースに作成し、複数の行を作成してそれらの新しい行に非同期編集できるようにすることです。DGV はデータ セット テーブルで満たされています。DGV とデータベースの間にデータ セットを配置することがベスト プラクティスであることがわかりました (または、少なくとも柔軟性が得られます)。
ユーザーが作成した複数の新しい行を編集するには、データ セットがデータベースから自動インクリメント主キーを取得し、新しい行の更新されたキー値を DGV に再入力できる必要があります。または、少なくともそれが、この作業を行うことがわかった唯一の方法です。問題は、データテーブルに行を追加しようとすると、1 行ではなく 3 行になることです。
[簡潔にするために古い投稿を削除]
以下は、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()
です。
それが 1 行の空白行を追加する正しい方法でない場合、それは何ですか? SQLの挿入/更新コマンドを投稿できますが、追加は1行ではなく3行になるため、それは問題ではありません。明確にするために、MsgBox
項目を1回だけ実行して3行を生成します。
また、興味深いことに、InsertAt コマンドでも同じ結果が得られます。
ds.Tables(DTName).Rows.InsertAt(DaZZDataRow, CurrentCellPoint.Y)
代わりに、ds.Tables(DTName).Rows.Add()
まだ 3 つの新しい行が生成されます。Access の新しいスクラッチ DB でもこれを試してみましたが、同じ問題が発生しました。
これは、VS2012 プロジェクトとダミー データベースとしてのコードの実例です。これは非常に必要最小限のものです。つまり、エラー処理はありませんが、エラーを表示し、利便性を高めるために行を削除することもできます。見てくれた人ありがとう。