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

If DataRow exists in DataTable, update values within it

每次用户更改我的 DataGridView 中可编辑列之一的值时,都会触发最多 8 个字段的重新计算。这意味着 DataGridView 上的事件 CellValueChanged 事件将触发超过 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

我怎样才能做到,如果一行已经存在,它每次都会更新其中的值?

DataSet 中的 DataTable 没有分配主键,但有 3 列将用作每行的唯一值。

[根据评论更新]

使用上面显示的代码,用户将更新第 1 列中的值 >

事件被触发并创建新行,其中将包含第 1 列中的新值 >

第 2 列根据第 1 列中的更改重新计算 >

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

根据前面提到的任一列的更改重新计算第 3 列 >

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

我想要实现的是让 1 行包含所有新值,不需要生成任何其他行,但其中包含用户操作的更改以及基于此的任何重新计算。

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

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 数据库。