Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Änderungen einer DataGridView-Zelle feststellen

441 views
Skip to first unread message

Christoph Michalski

unread,
Oct 12, 2008, 8:51:00 AM10/12/08
to
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

Peter Götz

unread,
Oct 12, 2008, 12:20:27 PM10/12/08
to
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)


Frank Dzaebel

unread,
Oct 12, 2008, 5:11:53 PM10/12/08
to
Hallo Christoph,

> 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

Peter Götz

unread,
Oct 13, 2008, 2:42:49 AM10/13/08
to
Hallo Christoph, hallo Frank,

> 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.

Frank Dzaebel

unread,
Oct 13, 2008, 5:55:10 AM10/13/08
to
Hallo Christoph,

Ich denke mein gepostetes Code-Beispiel ist
das, was Du suchst und wohl die
einfachste Möglichkeit.

0 new messages