(我已经改写了整个问题,试图在我正在尝试做的事情中更加明确)
这是一个用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
都将是来自数据库表的值。
我将此标记为已回答...
答案 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()