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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wenn Sie auf die Jagd gehen, lange genug und genug Zeit versuchen verschiedene Dinge, Sie werden irgendwann eine Antwort finden...
Hier ist der funktionierende code, den ich endete mit:
Ein paar Anmerkungen:
Ohne Aufruf von EndEdit() der BindingSource, wird die änderung nicht erkannt werden, da diese aufgerufen wird, ist durch das CellValueChanged, was passiert, vor die BindingSource ist geändert.
Habe ich versucht, indem eine Else-Klausel legen Sie die BackColor-der ursprünglichen Farbe (wenn die DGV-Zeile erkannt werden, die gleichen wie die DataSet-Zeile oder wenn die Validierung fehlschlägt), aber ich kann nicht herausfinden, wie zu berücksichtigen, für die DGV.AlternatingRowsDefaultCellStyle.BackColor-Eigenschaft festgelegt wird. Ideen???
Ich denke, dies könnte verbessert werden, da habe ich die Zeile und Spalte Indizes in der Methode, nur die direkt auf die Datasets/DataTables die entsprechende Zeile und vergleichen, nur, dass anstelle der Iteration durch den gesamten Datenbestand. Ideen auf, dass man dankbar sein, aber ich werde noch einige Tests durchführen, um zu sehen, wenn ich es bekommen kann (ich dachte es mir so weit...)