2014-12-07 77 views
0

我在試圖改寫這一整個問題是什麼,我試圖做更清晰)還原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

一些調查研究後,我能弄清楚如何訪問指定單元格的數據集的原創,編輯前值。

在上面我的變量賦值代碼添加了此行來獲得相關數據集行:

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()