使用DataTable DataSource在已排序的DataGridView上更新行

时间:2016-05-20 21:27:16

标签: vb.net sorting datagridview datatable sql-update

我在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事件发生?

1 个答案:

答案 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进行上述检查......