我在VB.NET 4.5中有一个Win Forms应用程序。在其中,我使用DataGridView
DataTable
作为其DataSource
和明确定义的SqlDataAdapter
来保持所有并发。 DataTable
首先由Sql Server命令填充,然后绑定如下:
Dim dt_Fishes AS New DataTable
Dim da_Fishes = New SqlDataAdapter("SELECT FishesKey, NetKey, b, c, d, e, (etc) FROM tblFishes WHERE NetKey = @NetKey;", conn)
da_Fishes.SelectCommand.Parameters.AddWithValue("@NetKey", intNetKey)
Dim cmdbld_Fishes As New SqlCommandBuilder(da_Fishes)
dt_Fishes.Locale = System.Globalization.CultureInfo.InvariantCulture
Try
conn.Open()
da_Fishes.Fill(dt_Fishes)
Catch ex As Exception
' etc
Finally
conn.close()
End Try
da_Fishes.DeleteCommand = New SqlCommand("DELETE FROM dbo.tblFishes WHERE FishesKey = @FishesKey;", conn)
da_Fishes.DeleteCommand.Parameters.Add("@FishesKey", SqlDbType.Int)
dgv_Fishes.DataSource = dt_Fishes
FormatDGV(dgv_Fishes) ' adds DataGridViewComboBoxColumns and colours, hides keys, etc
当数据未排序时,这一切都正常工作 - 插入,更新和删除在进行行级验证时正常运行。一旦用户离开他们正在处理的行,就会触发行级验证。
当用户点击列标题时,DataGridView
会在视觉上对数据进行排序(非常棒!)。我的问题是,当用户继续编辑已排序的DataGridView
中的行,并离开该行(通过输入或向下键盘键)时,不会触发验证事件。奇怪的是,如果用户然后键入DataGridView
中通常属于编辑数据行的行号的单元格,然后离开,则验证将触发,并且数据更新成功发生。
当RowValidating
排序后,当用户正常离开编辑的行时,如何强制DataGridView
事件发生?
答案 0 :(得分:0)
为红鲱道歉:
在进一步调查中,RowValidating
事件确实在离开时触发。然后RowValidated
事件触发,但是当我检查DataTable
的行状态时,我的问题似乎发生了。排序DataGridView
后,它和基础DataTable
不再具有相似的行号。这就是为什么这个if
- 陈述是我问题的罪魁祸首:
Private Sub dgv_RowValidated(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_Main.RowValidated
Dim dgv_Sender As DataGridView = sender
QueryAction = dt_Sender.Rows(e.RowIndex).RowState
If dt_Sender.Rows(e.RowIndex).RowState <> DataRowState.Unchanged Then
da_Fishes.Update(dt_Fishes)
所以,我需要另一种方法来检查行状态(if
语句的目的是最小化不必要的更新)。
鉴于此,我原来的问题是
使用DataTable在已排序的DataGridView上发布更新行 数据源
已经解决了,因为我现在要转而采用不同的方法对排序DataGridView
进行上述检查......