[Pembaruan Catatan:]
Keinginan saya adalah agar pengguna yang menambahkan baris baru ke datagridview (DGV) akan dapat membuat baris tersebut dibuat dalam database Access, dan dapat membuat beberapa baris dan pengeditan yang tidak sinkron pada baris baru tersebut. DGV diisi oleh tabel kumpulan data, dan menurut saya, memiliki kumpulan data antara DGV dan database adalah praktik terbaik (atau setidaknya memungkinkan fleksibilitas).
Untuk mengedit beberapa baris baru yang dibuat pengguna, kumpulan data harus dapat mengambil kunci utama kenaikan otomatis dari database, dan kemudian mengisi ulang DGV dengan nilai kunci yang diperbarui untuk baris baru. Atau setidaknya itulah satu-satunya cara yang saya temukan untuk mendapatkan pekerjaan ini. Masalahnya adalah ketika saya mencoba menambahkan baris ke datatable, akhirnya menghasilkan tiga baris, bukan satu.
[Postingan lama dihapus agar singkatnya]
Berikut adalah cara DGV pertama kali diisi dan diikat ke kumpulan data:
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
Memperbarui:
Saya masih tidak dapat memecahkan masalah ini. Ini disebut ketika menangani DGV.UserAddedRow
. Saya telah mempelajarinya kode asli mungkin bukan cara terbaik untuk hanya Menambahkan 1 baris, tetapi bahkan membuat Baris Baru pun mengalami masalah yang sama:
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)
Masalahnya selalu pada langkah ds.Tables(DTName).Rows.Add()
. Tidak masalah apa yang dimasukkan dalam tanda kurung pada .Add()
. Bisa berupa angka atau bilangan apa pun termasuk 0 dan akan menghasilkan 3 baris. Itu tidak dipanggil berkali-kali. Hanya menelepon ds.Tables(DTName).Rows.Add()
.
Jika itu bukan cara yang tepat untuk menambahkan satu baris kosong, lalu apa? Saya dapat memposting perintah penyisipan/perbarui SQL, tetapi itu bukan masalah karena penambahan membuat tiga baris, bukan 1. Untuk lebih jelasnya, ini hanya akan dijalankan melalui item MsgBox
satu kali dan menghasilkan 3 baris.
Juga membuat saya penasaran, perintah InsertAt memberikan hasil yang sama:
ds.Tables(DTName).Rows.InsertAt(DaZZDataRow, CurrentCellPoint.Y)
bukannya ds.Tables(DTName).Rows.Add()
masih menghasilkan 3 baris baru. Saya juga sudah mencoba ini pada DB awal baru dari Access dan mendapatkan masalah yang sama.
Berikut adalah contoh kode yang berfungsi, sebagai Proyek VS2012 plus tiruan basis data. Ini cukup sederhana, yaitu tidak ada penanganan kesalahan, tetapi ini menunjukkan kesalahan dan juga memungkinkan penghapusan baris sebagai tambahan kenyamanan. Terima kasih kepada siapa pun yang melihatnya.