DatagridView Edit einer Zelle abbrechen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    DatagridView Edit einer Zelle abbrechen

    Hi,

    ich habe eine DataGridView dgvDictionary

    Ich möchte gern eine Möglichkeit haben einen begonnenen Edit einer Cell abzubrechen, d.h. den Edit zu beenden und die Daten der Zelle vor dem Edit wieder herzustellen.

    So habe ich das versucht:

    VB.NET-Quellcode

    1. dgvDictionary.CancelEdit()


    Nach dieser Anweisung werden der Reihe nach die Prozeduren dgvDictionary.CellValueChanged und dgvDictionary.CellEndEdit aufgerufen. Diese Routinen habe ich deaktiviert, so dass nichts ausgeführt wird.

    Danach wird die DatagridView angezeigt ... und die Daten der Zelle sind NICHT restauriert worden. D.h. trotz .CancelEdit ist die Änderung wirksam geworden.

    Was mache ich denn falsch ?

    LG
    Peter
    @Peter329 Vielleicht bedeutet CancelEdit das Abbrechen der Editier-Aktion zum gegenwärtigen Zustand.
    Gibt es da so was wie ein Undo? Das wäre dann wohl das, was Du suchst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ne, eine Undo Methode finde ich nicht.

    Es gibt allenfalls eine CellUpdate Methode ...aber ob mir das hilft.

    Ich hab die Sache in einem kleinen Testprojekt konstruiert: eine DatagridView und ein Button. Auch da verhält sich CancelEdit so wie beschrieben.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. DataGridView1.Rows.Add("aaaaa", "xxxxx")
    4. DataGridView1.Rows.Add("bbbbb", "yyyyy")
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. DataGridView1.CancelEdit()
    8. End Sub
    9. End Class

    Peter329 schrieb:

    eine Undo Methode finde ich nicht.
    Dann solltest Du vielleicht zu Beginn der Bearbeitung den Zellinhalt einfach abspeichern, clone die Zelle, wenn es kompliziert wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Na ja, ich kann im BeginEdit Event die Zelleninhalte sichern. Das ist kein Problem.

    Die Werte könnte ich dann schon nach dem CancelEdit von Hand zurückspeichern. Dabei muss ich aber darauf aufpassen, weil jetzt das CellValueChanged Event zweimal aufgerufen wird.

    Aber dann frage ich mich, wozu die CancelEdit Methode überhaupt gut sein soll ? Dann kann ich doch gleich EndEdit aufrufen. In der Doku steht drin, dass mit CancelEdit alle Änderungen verworfen werden. Das Code Beispiel baut aber die DatagridView komplett neu auf !

    Der Edit Mode erfolgt doch ein einer dynamisch generierten Textbox. D.h. zunächst mal wird doch die dgv Zelle gar nicht verändert. Da müsste es doch eine Möglichkeit geben, den Edit wirklich abzubrechen, d.h. die Zelle unverändert zu lassen.

    Was ist also der Unterschied zwischen EndEdit und CancelEdit ?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. DataGridView1.Rows.Add("aaaaa", "xxxxx")
    4. DataGridView1.Rows.Add("bbbbb", "yyyyy")
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Dim retval1 As Boolean = DataGridView1.CancelEdit()
    8. Debug.Print("Retval1=" & retval1.ToString)
    9. End Sub
    10. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    11. Dim retval2 As Boolean = DataGridView1.EndEdit()
    12. Debug.Print("Retval2=" & retval2.ToString)
    13. End Sub
    14. End Class


    Button1 (CancelEdit) und Button2 (EndEdit) liefern (soweit ich das sehe) genau das gleiche Resultat. Der Edit Mode wird verlassen und die Änderung wird wirksam !

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Aber dann Frage ich mich, wozu die CancelEdit Methode überhaupt gut sein soll ?
    Die MSDN sagt:
    Bricht den Bearbeitungsmodus für die aktuell ausgewählte Zelle ab und verwirft alle Änderungen.
    Kann es sein, dass Du das falsch einsetzt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok ... jetzt habe ich das geschnallt:

    Der Click auf irgendeinen Button beendet schon den Edit Modus !

    Und damit kommt die CancelEdit Anweisung zu SPÄT !

    Mit anderen Worten, so einfach geht das mit dem CancelEdit per ButtonClick nicht. Man muss also tatsächlich die Inhalte sichern und dann wieder restaurieren.

    Danke, dass du dich mit meinem Problem beschäftigt hast. Manchmal ist es ja schon hilfreich, wenn man weiß, dass man nicht vollkommen auf dem Holzweg ist. Daumen hoch und vielen Dank !

    LG
    Peter
    @Peter329 Ich hab da noch eine Idee, und zwar solltest Du Dir einen Restaurationspunkt setzen, d.h., den zustand als "ursprünglich" markieren, der wiederhergestellt wird, also ein Save der DataSource oder so.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab sogar eine noch viel bessere Idee:

    Das Problem liegt doch daran, dass der Button Click den Edit Mode beendet.

    Deshalb verkneifen wir uns den ButtonClick ganz einfach und benutzen stattdessen die ESCAPE Taste !

    Im Edit Mode wird durch diese Taste standardmäßig CancelEdit aufgerufen. Und jetzt funktioniert das, weil durch das Drücken der Escape Taste der Edit Mode erst nach dem CancelEdit beendet wird.

    Na, das hab ich ja gerade noch rechtzeitig im alten Jahr herausgefunden ! :)

    Ein gutes Neues Jahr 2018 und
    LG

    Peter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()