将DataGridView单元格内容还原为原始值

时间:2014-12-07 10:58:21

标签: vb.net validation datagridview dataset

我已经改写了整个问题,试图在我正在尝试做的事情中更加明确

这是一个用VS2012编写的VB.Net WinForms项目。

当用户更改DataGridView单元格的内容时,我正在更改单元格的背景颜色,以直观地向用户指示他们更改了哪些单元格。这很好。

但是,如果用户将单元格内容更改回最初编辑它之前的值(基本上是数据库表的值),我需要将背景颜色更改为其默认行背景颜色。

因此,在CellValidating事件中,我使用以下行来获取DataGridView绑定数据集中的值以及用户输入的值,以便我可以比较两者:

Dim dgvColDataName As String = dgvEmployees.Columns(e.ColumnIndex).DataPropertyName
Dim dgvRowID As Integer = CInt(dgvEmployees.Rows(e.RowIndex).Cells(1).Value)
Dim index As Integer = EmployeesDataSet.Tables("employees").Rows.IndexOf(EmployeesDataSet.Tables("employees").Rows().Find(dgvRowID))
Dim originalValue As String = EmployeesDataSet.Tables("employees").Rows(index).Item(dgvColDataName).ToString()
Dim enteredValue As String = dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).EditedFormattedValue.ToString()

这些获取DataGridView当前单元格与绑定表中相应单元格之间的正确对应值。

我在这里比较这些值,以确定输入的值是否与原始数据集的值相同:

If originalValue.ToUpper() <> enteredValue.ToString().ToUpper() Then
    ' Color the edited cell's background
    dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.LightPink
Else
    ' Set the back color to its default style
    dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).InheritedStyle.BackColor
End If

我认为这就是答案。更改值时将更改单元格背景。但我惊讶地发现,如果单元格失去焦点(离开编辑模式),然后用户在该单元格中单击并将值更改为最初编辑它之前的值,则单元格背面颜色不会更改回默认的行/单元格颜色。即显然,当单元格失去焦点时,数据集会发生变化,因此originalValue现在是最后输入的值。

我需要能够从首次加载DataGridView时或最后一次保存后获取值。

有什么想法吗?

更新

经过一些研究后,我能够弄清楚如何访问DataSet原始的预编辑给定单元格的值。

在上面的变量赋值代码中,我添加了这一行来获取相关的DataSet行:

Dim row As DataRow = EmployeesDataSet.Tables("employees").Rows(dsRowIndex)

然后我替换了这一行:

Dim originalValue As String = EmployeesDataSet.Tables("employees").Rows(index).Item(dgvColDataName).ToString()

用这个:

Dim originalValue As String = row(dgvColDataName, DataRowVersion.Original).ToString()

因此,在对此进行全面测试后,我相信无论DGV的状态如何,编辑控件等,originalValue都将是来自数据库表的值。

我将此标记为已回答...

1 个答案:

答案 0 :(得分:1)

以下代码将完成我想要做的事情。这是在CellValidating事件中。我正在使用它将值设置回原始单元格值,因为它来自数据库。

Dim dgvColDataName As String = dgvEmployees.Columns(e.ColumnIndex).DataPropertyName
Dim dgvRowID As Integer = CInt(dgvEmployees.Rows(e.RowIndex).Cells(1).Value)
Dim dsRowIndex As Integer = EmployeesDataSet.Tables("employees").Rows.IndexOf(EmployeesDataSet.Tables("employees").Rows().Find(dgvRowID))
Dim row As DataRow = EmployeesDataSet.Tables("employees").Rows(dsRowIndex)
Dim originalValue As String = row(dgvColDataName, DataRowVersion.Original).ToString()