Ich verwende das DataGridView-Steuerelement zum Lesen und Schreiben einer XML-Datei durch XML-Serialisierung.
Ich habe ein Problem, wie unten erklärt:
Danach wird der Wert der bestimmten Zelle nicht aktualisiert. Wenn ich den Fokus absichtlich verlagere (zB wenn ich auf eine andere Zelle im selben Raster klicke), wird der Wert aktualisiert.
Kann jemand irgendeine Lösung vorschlagen?
Der beste Weg (obwohl schnell und schmutzig) besteht darin, den currentCell-Wert Nothing
zuzuweisen.
Zum Beispiel in der Speichermethode:
%Vor%und fahren Sie dann fort.
Dies liegt daran, dass der bearbeitete Zellenwert erst dann an die DataSource übergeben wird, wenn sie validiert wurde. Dies geschieht, wenn die Zelle den Fokus verliert. Wenn Sie die Änderungen sofort festschreiben möchten, können Sie die CurrentCellDirtyStateChanged Ereignis und rufen Sie die CommitEdit-Methode im Handler auf:
%Vor%Wenn ich Sie richtig verstehe, befindet sich eine Zelle im Bearbeitungsmodus und Sie versuchen, die Bearbeitung programmatisch zu beenden und den Wert an die zugrunde liegende Datenquelle zu übergeben?
Ich verwende einen etwas "schmutzigen" Ansatz, um dies in einer meiner Anwendungen zu tun:
%Vor%Dieser Codeabschnitt prüft zuerst, ob sich die aktuelle Zelle im Bearbeitungsmodus befindet. Dann ändert es die aktuelle Zelle programmgesteuert (entweder in die vorherige Zeile oder die nächste Zeile, falls wir in der ersten Zeile sind). Danach stellt es die aktuelle Zellenauswahl wieder her.
Sie würden diesen Code in Ihrem "File Save As" -Handler aufrufen.
Ich hatte die gleiche Situation und ich benutzte sogar die Schnellzugriffstasten zum Speichern der Rasterwerte. Wenn ich auf Speichern Button Fokus verloren von DGV und damit Zelle Wert Committed, aber wenn ich mit der Taste Tastenkürzel nicht von DGV verloren daher keine Festschreibung der Zelle Wert.
Nachdem ich die Antwort von Amit Karmakar aus Neugier betrachtet habe, habe ich diese Antwort versucht und es hat funktioniert. Um mehr Details zu erfahren, ging ich in das Debugging des DGV und fand heraus, dass es in Wirklichkeit dasselbe ist wie commitedit, was irgendwie nicht funktioniert, wenn man es in der Speicherschaltfläche klickt.
Wenn wir CurrentCell von DGV auf null setzen, ruft DGV vor dem Setzen auf null zuerst den bearbeiteten Wert ab und schiebt ihn in den Zellenwert und setzt CurrentCell REFERENCE auf null. Hier bedeutet es nicht, dass die zugrunde liegende DGV-Zelle auf null gesetzt wird. Daher funktioniert das perfekt für das obige Problem.
Hinweis: Diese Lösung funktioniert möglicherweise nicht einwandfrei, wenn Sie Ereignisse für die Zelle validieren und wenn der Benutzer ungültige Daten eingibt, die die Validierung nicht bestehen. In diesem Fall schlägt das Setzen der aktuellen Zelle auf null fehl, da der Wert nicht in die Zelle verschoben werden kann.
Ich gab diese Erklärung, als ich Frage auf Amit Karmakar Frage aufgeworfen habe und gefragt habe, wie es möglich sein kann. Ich dachte, es könnte einem anderen helfen, also ließ ich diese Erklärung als Antwort fallen.
OK, das ist UGLY, aber es funktioniert, um die FINAL CHANGES aus dem Raster zu bekommen, OHNE dass man in eine andere Zeile wechseln muss:
%Vor%Aber ich mag die Antwort von Amit Karmakar immer noch am besten. Ich habe 'DataGridView1.CurrentCell = Nothing' zum DataGridView1 LostFocus-Ereignis hinzugefügt.
Sie können den Wert einer Zelle, die noch nicht festgeschrieben wurde, mit der EditedFormattedValue-Eigenschaft für die aktuelle Zelle abrufen, wie unten
%Vor%Tags und Links .net datagridview