Wie setzt Ihr das Abbrechen von Instanzwertbearbeitung um?

  • Allgemein

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Amro.

    Wie setzt Ihr das Abbrechen von Instanzwertbearbeitung um?

    Hallo zusammen.

    Wenn Ihr eine Klasseninstanz habt, die der Benutzer bearbeiten soll/darf, sollte es ja auch eine Möglichkeit geben, den Vorgang abzubrechen, auch wenn Teile der Daten schon innerhalb der Bearbeitungscontrols geändert wurden.

    Beispiel: Telefonbuchkontakte
    Man hat 20 Kontakte in einer Liste, wählt den 5. aus, bekommt die Details des Kontakts in einem Extradialog zu Gesicht und fängt an, diese zu bearbeiten. Dann stellt man fest, das man das doch nicht will und klickt auf [X] oder auf einen Abbrechen-Button. Wie stellt Ihr sicher, dass jetzt die teilweise vorgenommenen Änderungen nicht übernommen?
    Wenn man kein DataBinding verwendet, ist es wohl einfach, da man ja die Daten manuell in die Controls reinschaufelt und sie dann dort wieder manuell abholt - oder eben auch nicht. Aber mit DataBinding wird es komplizierter, da ja die Instanzdaten quasi adhoc geändert werden.
    Welche Möglichkeiten verwendet Ihr? Mir würde einfallen:

    WinForms
    • DataBinding der Controls so einstellen, dass die Daten nicht sofort aktualisiert werden. Wenn auf Speichern geklickt wird, ändert man das DataBinding so, dass die Werte übernommen werden (DataSourceUpdateMode.OnValidation) und ruft BindingSource.EndEdit auf, um die Werte ins Model zu übernehmen.
    • BindingSource.CancelEdit aufrufen - klappt nur, wenn die zugrundeliegenden Daten dies unterstützen, was bei nem tDS gegeben ist, sonst von Haus aus nicht.
    mit Datenbank
    • Wiederherstellung eines DB-Eintrags
    allgemein/sonst
    • Memento Pattern - alle Daten in einem Duplikat speichern und entweder Original oder Duplikat bearbeiten, bei Speichern oder Abbruch das ein oder andere verwerfen

    Habe bei meinen Programmen zwar noch am Programmende die Möglichkeit, alle Änderungen der aktuellen Sitzung zu verwerfen, aber das ist der Holzhammer, der für ganz krasses Datenrummurksen vorgesehen ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    jo, entweder: tDs + bs.CancelEdit
    oder
    (selten, und nur wenn Vorgabe ist, mit POCOs zu arbeiten): Memento-Pattern.
    Wobei ich hier grad eine Variante angucke, da ist Vorgabe, den Datensatz, den eh habe, nochmal frisch abzurufen. Dassis dann eine Dublette, und kann ich den vorherigen als Memento-Objekt benutzen.
    Mich würde natürlich auch interessieren, wie da das Standardvorgehen in WPF zzgl. MVVM wäre.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hm Standards kenne ich nicht, aber in MVVM bist du mit den grundlegenden Elementen schon nah dran an POCO.

    Vielleicht kannst du auch einen Status an die Instanz packen, wie es eine typisierte DataTable mit Datensätzen macht. Added, Modified, Deleted, etc.
    Darüber entscheidet sich dann ja wie die Quelle das Ding behandelt
    Damit ich noch weitere WPF/MVVM-Kenner* ins Boot hole, falls sie sich äußern können/wollen: Wie macht Ihr das @Amro, @siycah?

    * kein Anspruch auf Vollständigkeit. Nichtnennungen sollen keine Aussage über Fähigkeiten anderer Nutzer machen ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ob das jetzt nun das "richtige" Vorgehen ist oder nicht hängt immer vom Einzelfall ab.

    In Fällen, wo ich sowas mit WPF umgesetzt habe, habe ich die Daten vor dem Bearbeitungsschritt immer in eine Backup-Datei geschrieben. Die habe ich dann meist mit einem . oder ~ Präfix geschrieben.
    Im Abbruchfall habe ich dann einfach die Datei neu reingeladen und den Vorgang dann abgeschlossen.
    Wurde eine Bearbeitung dann mit "OK" beendet, habe ich die Backup-Datei gelöscht.

    Das habe ich dann immer mit Commands gemacht.

    War nicht das effizienteste Vorgehen, aber in solchen Fällen war das Bearbeiten eher selten und somit kein Problem.
    In meinem Fall waren das dann Laufzeiten von wenigen Millisekunden, bis der User die Bearbeitung anfangen konnte.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.
    Hab mir da noch nie gedanken gemacht.

    Ich würde vielleicht den Kontakt (SelectedItem) aus dem Viewmodel des Anzeigenden Fensters, an das Viewmodel des Bearbeitungs Fensters übergeben.
    Das Berarbeitungs Fenster hat eine eigene Eigenschaft Kontkakt zum bearbeiten.
    Beim speichern würde ich diese dem Selecteditem des Anzeigenden Fensters zuweisen.
    Das Binding sollte eigenlich greifen meine ich.
    Beim Cancel halt die gewünschten Funktionen.
    Das ist jetzt aber nur so eine Idee von mir und kein Paradigma aus WPF

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