如果DataTable中存在DataRow,请更新其中的值



每次用户更改DataGridView中某个可编辑列中的值时,都会触发多达8个字段的重新计算。这意味着DataGridView上的事件CellValueChanged event将触发1次以上。

我想在DataSet.DataTable中创建一行,在用户更改值后,该行将包括所有列的新值。

我遇到的问题是,下面的代码为由于重新计算的列而更改了值的每列创建一行。

Private Sub PL_DGV_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles PL_DGV.CellValueChanged
If isLoaded Then
Dim grid_row As DataRow = Me.DataSet.PL.Rows(e.RowIndex)
Dim unsaved_row As DataRow = grid_row
Me.DataSet.PL_UnsavedChanges.ImportRow(unsaved_row)
unsaved_changes = True
End If
End Sub

如果一行已经存在,我该如何做到每次都只更新其中的值?

数据集中没有分配给DataTable的PrimaryKeys,但每行有3列将用作唯一值。

[根据评论更新]

使用上面显示的代码,将会发生的是用户将更新列1>

事件被触发并创建新行,该新行将包括列1>

列2基于列1中的变化而重新计算>

事件被触发并创建新行,该新行将包括列1和列2中的新值>

列3基于对前述列中任一列的改变而被重新计算>

事件被触发并创建新行,该行将在第1列、第2列和第3列中包含新值。

我想要实现的是有一行,它将具有所有的新值,不需要生成任何其他行,而是包含用户操作的更改和基于此的任何重新计算。

在评论中讨论后,我的问题的解决方案,或者更确切地说,我为克服它所做的是:

Dim grid_row As DataRow = Me.DataSet.PL.Rows(e.RowIndex)
Dim Column1 = Variable1
Dim Column2 = grid_row.Item("Column2").ToString().Trim()
Dim Column3 = grid_row.Item("Column3").ToString().Trim()
Dim Updated_column_name = Me.DataSet.PL.Columns(e.ColumnIndex).ColumnName
Dim Updated_value = grid_row.Item(Updated_column_name).ToString()
Dim row As DataRow = Me.DataSet.PL_ChangesLog.NewRow()
row("price_list") = Price_list
row("warehouse") = Warehouse
row("product_code") = Product
row("column_name") = Updated_column_name
row("updated_value") = Updated_value
row("timestamp") = DateTime.Now()
row("username") = Environment.UserName()
Me.DataSet.PL_ChangesLog.Rows.Add(row)
unsaved_changes = True

这使我能够创建一个DataTable,为每个更新了值的单元格保存一行数据,无论是通过代码还是用户操作重新计算。

基于此,我可以挑选出最后一次审计,并将其用作";保存更改";以将更改提交到SQL数据库。

最新更新