更新具有DataTable DataSource的已排序DataGridView上的行时出现问题



我在VB.NET 4.5中有一个Win Forms应用程序。在它中,我使用DataGridViewDataTable作为其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执行上述检查。。。

最新更新