Erkennen von Zeilen im DataGridView-Zelle, deren Werte geändert wurden, durch die Benutzer

Habe ich eine VB.NET WinForms-Projekt, das Baue ich in VS2013. In einem DataGridView an ein DataSet gebunden ich möchte hervorheben, jede Zeile, die der Benutzer geändert hat - und wenn der Benutzer nach der änderung einer Zeile den Inhalt wieder auf seine ursprünglichen Werte (im Vergleich zu den Datenbank-Werte) möchte ich entfernen Sie die Markierung.

Ich war Googeln für eine Weile jetzt, und habe nicht wirklich bekommen überall.

Alles was ich zu diesem Zeitpunkt wissen, ist, dass EmployeesDataSet.HasChanges(DataRowState.Modified) gibt False zurück, in das CellValueChanged Ereignis, nachdem er den geänderten text in eine Zelle geklickt und aus der Reihe.

Meine Vermutung ist, dass die gesamte Methode wäre so etwas wie auf KeyUp-Ereignis vergleichen der aktuellen Zeile die Zelle Werte auf den Datensatz (oder BindingSource oder TableAdapter?) und wenn etwas anders ist, markieren Sie die Zeile, andernfalls setzen Sie die Zeile, um die Standard-Hintergrundfarbe.

Aber ob das die richtige Vorgehensweise ist, verstehe ich nicht, was ich vergleichen würde die Zeile den Inhalt an. Wäre es das DataSet? Der TableAdapter? Die BindingSource? Wenn es einer von denen sein, wie Vergleiche ich die richtige Zeile?

UPDATE

Einige weitere Forschung hat einige Fortschritte gemacht:

Fand ich diese iteration code:

Dim dsChanged As DataSet = EmployeesDataSet.GetChanges()

For Each dt As DataTable In dsChanged.Tables
    For Each row As DataRow In dt.Rows
        For i As Integer = 0 To dt.Columns.Count - 1
            Dim currentBackColor As System.Drawing.Color = dgvEmployees.AlternatingRowsDefaultCellStyle.BackColor
            If Not row(i, DataRowVersion.Current).Equals(row(i, DataRowVersion.Original)) Then
                dgvEmployees.Rows(dt.Rows.IndexOf(row)).DefaultCellStyle.BackColor = Color.LightPink
            Else
                ' No changes so set it to its original color
                dgvEmployees.Rows(dt.Rows.IndexOf(row)).DefaultCellStyle.BackColor = currentBackColor
            End If
        Next
    Next
Next

Lege ich diese in eine separate Sub, die aufgerufen wird, in der DataGridView.CellValueChanged Ereignis.

Richtig erkennt die Zeilen, die geändert wurden Werte von Zellen, aber mein code der Farbe, der hintergrund ist nicht ganz richtig. Wie es ist, es färbt jede nachfolgende Zeile von oben nach unten, wie ich änderungen vornehmen - unabhängig davon, welche Zeile in der DGV ich Bearbeiten.

Bin ich davon ausgegangen, daß die dt.Zeilen.IndexOf(Zeile) korrekt, erhalten Sie den korrekten index des DGV, da ich das Durchlaufen der DGV die DataTable.

  • Beim laden der form, ich würde erstellen Sie eine Liste mit den unmodifizierten Daten aus Ihrem gebundenen DataGridView (Daten im dataset). Wenn ein Benutzer ändert den DataGridView, werden Sie in der Lage, vergleichen Sie Ihre ursprüngliche Liste der Daten, um die aktuellen Daten in der DataGridView. Ermöglicht Ihnen, zu entscheiden, ob oder ob nicht, ändern Sie die Zeile Farbe oder dem Benutzer mitteilen, es gibt einen geänderten Eintrag in der grid-Ansicht.
InformationsquelleAutor marky | 2014-11-21
Schreibe einen Kommentar