2014-12-07 2 views
0

(я перефразировал весь этот вопрос в попытке быть более ясно, что я пытаюсь сделать)содержимого ячейки Revert DataGridView к исходному значению

Это проект VB.Net WinForms записывается в VS2012.

Когда пользователь меняет содержимое ячейки 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 или после последнего сохранения.

Любые идеи?

UPDATE

После еще некоторых исследований я был в состоянии понять, как получить доступ к исходному, значению предварительного редактирования набора данных из данной ячейки.

В коде переменной назначения выше я добавил эту строку, чтобы получить соответствующую 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

Ниже код будет выполнять то, что я пытался сделать. Это событие 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() 
Смежные вопросы