首页 > 解决方案 > 如果 DataRow 存在于 DataTable 中,则更新其中的值

问题描述

每次用户更改我的 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 分配 PrimaryKey,但有 3 列将用作每行的唯一值。

[根据评论更新]

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

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

第 2 列根据第 1 列的变化重新计算 >

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

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

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

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

标签: vb.netdatagridviewdatagridviewrow

解决方案


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

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


推荐阅读