> 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)
> Nun soll der User die Möglichkeit bekommen, die
> Daten im DataGridView zu ändern. Ich möchte beim
> späteren Aufruf die modifizierten Zellen farblich
> markieren, ... , welche Felder geändert wurden.
In C# zum Beispiel:
private void dataGridView1_CurrentCellDirtyStateChanged(
object sender, EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
dataGridView1.CurrentCell.Style.BackColor = Color.LightGray;
}
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
> In C# zum Beispiel:
>
> private void dataGridView1_CurrentCellDirtyStateChanged(
> object sender, EventArgs e)
> {
> if (dataGridView1.IsCurrentCellDirty)
> dataGridView1.CurrentCell.Style.BackColor = Color.LightGray;
> }
_CurrentCellDirtyStateChanged() signalisiert lediglich, dass
sich der Inhalt der betr. Zelle verändert hat. Damit alleine wird
aber nicht sichtbar, ob der Inhalt der Zelle mit dem ursprüng-
lichen Originalwert
DataTable.Rows(x).Item(x,DataRowVersion.Original
übereinstimmt. Ändert man den originalen Zellenwert
von z.B. "ABC" nach "XYZ", so löst dies
_CurrentCellDirtyStateChanged aus. Ändert man den
Wert anschliessend wieder nach "ABC", löst auch das
wieder _CurrentCellDirtyStateChanged aus. Auch hier
wäre u.U. ein zustätzlicher Vergleich des akt. Zellenwertes
mit dem ursprünglichen Originalwert hilfreich.
Ich denke mein gepostetes Code-Beispiel ist
das, was Du suchst und wohl die
einfachste Möglichkeit.