我在VB.NET 4.5中有一个Win Forms应用程序。在它中,我使用DataGridView
和DataTable
作为其DataSource
,并使用定义良好的SqlDataAdapter
来保持所有内容的并发性。DataTable
首先由SqlServer命令填充,然后像这样绑定:
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
中键入一个通常属于已编辑数据行的行号单元格,然后离开该单元格,则会触发验证并成功进行数据更新。
在对DataGridView
进行排序时,当用户正常离开编辑的行时,如何强制发生RowValidating
事件?
为转移注意力道歉:
经过进一步调查,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
执行上述检查。。。