Änderungen einer DataGridView-Zelle feststellen

12/10/2008 - 14:51 von Christoph Michalski | Report spam
Hallo,
ich benutze in meinem Programm einen DataGridView das an eine DataView
gebunden ist.
Nun soll der User die Möglichkeit bekommen, die Daten in DataGridView zu
àndern. Ich möchte beim spàteren Aufruf die modifizierten Zellen farblich
markieren, damit man sofort sieht, welche Felder geàndert wurden.
Nun meine Frage: wie kann ich feststellen, welche Felder (also cells)
geàndert wurde und welche nicht. Ich kenne zwar den RowState einer DataView,
der bezieht sich aber auf den gesammten Datensatzt. Gibt es was Ähliches in
Bezug auf eine einzelne Cell?
wàre für jeden Tipp sehr dankbar
Gruß
Christoph
 

Lesen sie die antworten

#1 Peter Götz
12/10/2008 - 18:20 | Warnen spam
Hallo Christoph,

ich benutze in meinem Programm einen DataGridView
das an eine DataView gebunden ist.
Nun soll der User die Möglichkeit bekommen, die Daten
in DataGridView zu àndern. Ich möchte beim spàteren
Aufruf die modifizierten Zellen farblich markieren, damit
man sofort sieht, welche Felder geàndert wurden.
Nun meine Frage: wie kann ich feststellen, welche Felder
(also cells) geàndert wurde und welche nicht.



Du kannst den Originalwert des zugehörigen DataRow.Item
mit dem sichtbaren Wert in der akt. DGV-Zelle vergleichen
und entsprechend dem Vergleichsergebnis Vorder- und/oder
Hintergrundfarbe der Zelle àndern.

Kleines Beispiel.

' /// Code in einer leeren Form1
Public Class Form1
Private WithEvents DGV As DataGridView
Private mDT As DataTable
Private mDV As DataView
Private mCM As CurrencyManager

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

DGV = New DataGridView
With DGV
.DefaultCellStyle.Font = _
New Font("Arial", 12)

.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

.Dock = DockStyle.Fill
End With
Me.Controls.Add(DGV)

CreateData()
DGV.DataSource = mDV
DGV.AutoResizeColumns()
End Sub


Private Sub DGV_CellValidating _
(ByVal sender As Object, _
ByVal e As DataGridViewCellValidatingEventArgs _
) Handles DGV.CellValidating

Dim DRV As DataRowView = _
DirectCast(mCM.Current, DataRowView)

Dim DR As DataRow = DRV.Row
Dim Col As Integer = DGV.CurrentCell.ColumnIndex

If DR.RowState = DataRowState.Detached Then
' neue Zeile Blau unterlegt.
DGV.CurrentCell.Style.BackColor = Color.Blue
DGV.CurrentCell.Style.ForeColor = Color.Yellow
Else
' vorhandene Zeile
If DGV.CurrentCell.EditedFormattedValue.Equals _
(DR.Item(Col, DataRowVersion.Original).ToString) Then

' original
DGV.CurrentCell.Style.BackColor = Color.White
DGV.CurrentCell.Style.ForeColor = Color.Black
Else
' geàndert
DGV.CurrentCell.Style.BackColor = Color.Red
DGV.CurrentCell.Style.ForeColor = Color.White
End If
End If
End Sub


Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("SText", GetType(String))
.Columns.Add("LText", GetType(String))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, True)
DR.Item(2) = MonthName(i, False)
.Rows.Add(DR)
Next
.AcceptChanges()
End With

mDV = New DataView(mDT)

mCM = _
DirectCast(Me.BindingContext(mDV), _
CurrencyManager)
End Sub
End Class
' \\\ E N T E

Code in ein leeres Formmodul kopieren und dann
das Programm starten.
Wenn Du im Grid Zellen vorhandener Zellen ànderst,
werden diese Rot hinterlegt, Zellen in einer neuen
Zeile werden blau hinterlegt.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen