绑定数据网格视图不接受新行



我有一个带有dgv的表单,在表单的顶部我有:

Dim ds1 As DataSet = New DataSet
Dim da1 As MySqlDataAdapter = New MySqlDataAdapter
Dim dt As DataTable = New DataTable
Dim myBuilder As MySqlCommandBuilder
Dim bsource As New BindingSource

然后我用绑定了dgv

Try
Using conn As New MySqlConnection(gen.connString)
Dim sql As String
sql = "SELECT ID, RoomType, RateCode, StandardPrice, Adults, Children, AdditionalAdult, AdditionalChild FROM rates " _
& "WHERE RateCode = @rateCode"
Using cmd As New MySqlCommand(sql, conn)
da1.SelectCommand = cmd
cmd.Parameters.AddWithValue("@rateCode", gen.strIDtoOpen)
End Using
ds1.Reset()
dt.Clear()
ds1.Reset()
conn.Open()
da1.Fill(ds1, "rats")
conn.Close()
myBuilder = New MySqlCommandBuilder(da1)
dt = ds1.Tables("rats")
bsource.DataSource = dt
End Using
dgvRoomTypes.DataSource = bsource
isDirty = False
Catch ex As Exception
MsgBox(ex.Message, vbExclamation, "Unexpected Error")
End Try

然后,我使用向数据集(ds1(添加新行

ds1.Tables(0).Rows.Add({id, roomType, gen.strIDtoOpen, 0, 0, 0, 0, 0})
ds1.AcceptChanges()

新行在dgv中显示得很好。然后我使用将其保存回表格

dgvRoomTypes.CurrentCell = Nothing
da1.Update(ds1, "rats")

出于某种原因,对现有行的编辑会保存到表中,但新行即使在dgv上显示得很好,也不会保存到表。我可能已经使用这个程序数百次了,但我已经花了几个小时,似乎找不到我缺少的

简而言之,数据行是一个智能的数据数组;如果您的目标是将数据保存到数据库中,则通常从数据库中下载或重新创建它。数据行跟踪其所有属性的更改,以便随时向您提供行上每列值的原始版本和当前版本,并维护一个状态以了解发生在它身上的一些事情

从数据库下载的一行,其RowState为Unchanged。如果更改了某个内容,它将变为"已修改"。如果删除它,它将变为"已删除"。如果向表中添加新行,则该行为"已添加"。如果你从表中提取一行,或者已经创建了它,但还没有将它添加到表中,那么它就是Detached

保存数据表时,RowState确定调用适配器Update时将运行的查询。适配器上的更新应该被认为是"更新";SaveChangesToDb";,不是UPDATE查询。Update迭代查看行状态的行:

  • 添加-运行INSERT
  • 已修改-运行UPDATE
  • 已删除-运行DELETE

执行操作后,适配器可能会在行上运行AcceptChanges,将其状态重置为Unchanged(用于更新/插入(或将其从数据表中删除(已删除(


至关重要的是,如果您调用AcceptChanges,则会重置状态,这意味着不会保存任何内容;所有行都标记为未更改

最新更新