[หมายเหตุ อัปเดต:]
ความปรารถนาของฉันคือให้ผู้ใช้เพิ่มแถวใหม่ลงใน DataGridview (DGV) จะสามารถสร้างแถวนั้นในฐานข้อมูล Access ได้ และเพื่อให้สามารถสร้างหลายแถวและการแก้ไขแบบไม่ซิงโครนัสในแถวใหม่เหล่านั้นได้ DGV กำลังเต็มไปด้วยตารางชุดข้อมูล และฉันพบว่าการมีชุดข้อมูลระหว่าง DGV และฐานข้อมูลเป็นแนวทางปฏิบัติที่ดีที่สุด (หรืออย่างน้อยก็ช่วยให้มีความยืดหยุ่น)
หากต้องการแก้ไขแถวใหม่ที่สร้างโดยผู้ใช้หลายราย ชุดข้อมูลจะต้องสามารถดึงคีย์หลักที่เพิ่มขึ้นอัตโนมัติจากฐานข้อมูล จากนั้นเติม DGV ด้วยค่าคีย์ที่อัปเดตสำหรับแถวใหม่ หรืออย่างน้อยนั่นคือวิธีเดียวที่ฉันพบว่ามีงานนี้ ปัญหาคือเมื่อฉันพยายามเพิ่มแถวลงใน DataTable มันกลายเป็นสามแถวแทนที่จะเป็นแถวเดียว
[กระทู้เก่าลบเพื่อความกระชับ]
ต่อไปนี้คือวิธีการเติม 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 insert/update ได้ แต่นั่นไม่ใช่ปัญหาเนื่องจากการเพิ่มสร้างสามแถว ไม่ใช่ 1 เพื่อให้ชัดเจน มันจะทำงานผ่านรายการ MsgBox
เพียงครั้งเดียวและให้ผล 3 แถว
อยากรู้เหมือนกันว่าคำสั่ง InsertAt ให้ผลลัพธ์เดียวกัน:
ds.Tables(DTName).Rows.InsertAt(DaZZDataRow, CurrentCellPoint.Y)
แทนที่จะเป็น ds.Tables(DTName).Rows.Add()
ยังคงให้ผล 3 แถวใหม่ ฉันได้ลองสิ่งนี้กับฐานข้อมูลเริ่มต้นใหม่จาก Access แล้วพบปัญหาเดียวกัน
นี่คือตัวอย่างการทำงานของโค้ด ในฐานะ VS2012 Project plus dummy ฐานข้อมูล แม้จะค่อนข้างเรียบง่าย กล่าวคือ ไม่มีการจัดการข้อผิดพลาด แต่จะแสดงข้อผิดพลาดและยังช่วยให้สามารถลบแถวได้เพื่อเพิ่มความสะดวกอีกด้วย ขอบคุณใครก็ตามที่เข้ามาดู