Frage

Nehmen wir an, eine Win-Form hat bestimmte Eingabefelder und Benutzer gibt / einige Daten wieder eintritt.

Wie behalten zuvor eingegebenen Daten von 'Undo' Operation?

Ich will nur ich den besten Weg, wissen, um es zu erreichen.

War es hilfreich?

Lösung

Es gibt ein paar Optionen. Das Wichtigste ist, dass man es in früh im Projekt beginnen zu entwerfen. kann es zu einem bestehenden Projekt hinzuzufügen versuchen, sehr teuer, wenn es nicht mit dieser Fähigkeit konzipiert wurde.

Es gibt ein paar grundlegende Muster, die Sie nutzen wollen werden:

  1. MVC oder Observer Muster. Der erste Schlüssel ist nicht so sehr die religiöse oder Muster-Eiferer Umsetzung Ihrer High-Level-Architektur. Was ist ist wichtig, dass die Software den Unterschied zwischen seinem aktuellen Zustand und dem angezeigten Zustand und abkoppelt in geeigneter Weise erkennt. Es muss eine gemeinsame, klar definierte Kopplung zwischen Ihrem visuellen Zustand und Ihrem Anwendungszustand sein. Dies bietet Ihnen die gemeinsame Architektur benötigen Sie einen Befehl erstellen (siehe # 2).

  2. Die Befehl Muster. Sie erhalten eine Menge Qualität mit dem Befehl Muster (obwohl es auf Kosten von Code kommen kann, der wie es aussieht, sollte Assistent generierten sein). Der spezifische Ansatz, den Sie mit dem Befehl Muster annehmen kann variieren (eine Klasse pro Befehl mit der Implementierung über Überschreibungen im Vergleich zu einer Klasse pro vielen Befehle mit der Implementierung über Event-Handler, zum Beispiel), aber Befehle sind die „Aktion“ Klasse, die @Ralph Strukturierung vorgeschlagen, einen Stapels um.

    Dies kann ein bisschen schwierig, aber der allgemeine Ansatz wäre für eine Veranstaltung zu hören, die „commit“ Daten aus dem visuellen Zustand in dem App-Status würde. Die Validated Ereignis könnte eine gute sein Haken für eine Textbox. Das Click Ereignis würde mehr Sinn machen für eine Button. Wenn die Commit geschieht, können Sie den Befehl create mit dieser Steuerung verbunden sind, versuchen Sie den Befehl auszuführen, und Sie den Befehl zu Ihrem Undo-Stack hinzufügen, wenn der Befehl erfolgreich ausgeführt wurde. Nun genau Sie Tracking, was passiert ist und genau die Daten, die es passiert mit.

  3. Die Memento Muster. @JP Zog das letzte Stück des Puzzles aus. Sie können eine Erinnerung an den gespeicherten Befehl zu speichern, was den Zustand der betroffenen Kontrolle war, bevor der Befehl ausgeführt wird. Dies, kombiniert mit einem UnExecute() Mitglied auf Befehl des Schnittstelle, sollte das letzte Kernstück des Entwurfs Sie benötigen, um Ihre Aufgabe zu erfüllen.

Das Schöne an einem strukturierten Ansatz wie dieser ist, dass Sie jetzt einen natürliche Erweiterung Punkt für zusätzliches Verhalten haben, die auf einem Befehl Basis geschehen muss. Transaktionen sind eine natürliche Ergänzung, zum Beispiel. In meinem aktuellen Projekt, verwende ich die WPF ICommand Schnittstelle (in meinem Winforms-Projekt) Feedback darüber, ob einem bestimmten Befehl liefern CanExecute() zu einem bestimmten Zeitpunkt. Auf diese Weise kann mich ermöglichen und UI-Widgets in geeigneter Weise in eine rein befehlsgesteuerte Art und Weise deaktivieren. :)

Die unglückliche Sache ist, dass es nicht viel Unterstützung für diese Struktur eingebaut in WinForms (soweit ich weiß), so dass Sie das meiste davon von Grund auf neu bauen müssen werde. Kein einziges Stück ist besonders kompliziert, aber man kann sich eine ganze Menge meist-Standardcode für jeden Befehl finden zu erzeugen. Es ist auch ein weit verbreitetes Designtechnik. Denn es wirksam zu sein, ha ess konsistent überall in den entsprechenden Abschnitten der Anwendung verwendet werden. Dies macht die Funktionalität ziemlich teuer Nachrüstung, vor allem, wenn der ursprüngliche Code ist eng gekoppelt und incohesive.

Andere Tipps

Ich bin mir nicht sicher, ob WinForms / .Net eine Art verfügt über eine integrierte in Undo-Funktion, die Sie nutzen können. Aber was Sie wirklich suchen, ist ein Stapel Datenstruktur eine Liste von Aktionen verwalten zu helfen. Sie müssen irgendeine Art von „Aktion“ Objekt erstellen, die Aktionen darstellen, die ein Benutzer tun könnten und wie sie durch die Anwendung Fortschritte werden Sie diese Aktionen auf den Stapel schieben müssen. Wenn sie drücken Sie die Undo-Taste oder Strg-Z oder was auch immer Verfahren zur Bestimmung der Undo-Aktion initiieren Sie die aktuelle Aktion Pop-off werden und den Anwendungsstatus auf die vorherige Aktion wieder her.

Dies ist eine sehr einfache und hohe Überblick darüber, wie dies funktionieren würde, aber ich kann mir vorstellen, dass ein solches Feature implementiert, kann recht komplex. Man stelle sich vor, wie es für ein Programm wie Adobe Photoshop arbeiten muss. : O

Dies ist vielleicht nicht der beste Weg zu gehen darüber je nachdem, was Sie erreichen wollen, aber man konnte eine richtextbox und ruft die Undo-Methode in diese Steuerung gebaut verwenden.

Zum Beispiel:

richTextBox1.Undo();

Diese und diese helfen könnte.

CTRL + Z arbeitet an einzelnen Steuerungen.

Wenn Sie mit Daten und ein Binding arbeiten, können Sie „rückgängig machen“, die nicht beibehalten Änderungen an die Eintragung (en) mit dem CancelEdit Funktion oder alternativ die Daten für die Datenbank neu zu laden können.

Mein Vorschlag ist es, die spezifischen Anforderungen Undo und ihre praktischen Vorteile vor dem Start die Konzeption und Umsetzung zu bestimmen. Ich eine WinForms-Anwendung geerbt, die eine Vielzahl von Betrieb sequenzieller über einen Stapel von generischer „Aktion“ Objekte intern rückgängig machen verwendet. Es stellte sich jedoch heraus, dass keiner der Nutzer der App ich mit der Nutzung sprach noch die Funktion angefordert! Und die Art und Weise diese besondere App funktioniert, wenn ich ein Benutzer der App war, würde ich gerade sehe mich auch nicht die Funktion.

Die Undo-Funktionalität könnte in diesem Fall nützlich gewesen, wenn es sich um eine ‚selektive‘ rückgängig zu machen war; wo könnte der Benutzer jede einzelne Operation / bearbeitet von mehreren früheren Bearbeitungen wählt, vor den Daten begehen und wiederherstellen letzte Operation, um diese einzelne bearbeitet zunächst von der Sekunde, gefolgt in seinen ursprünglichen Zustand, statt nur in der Lage zu sein die letzte Operation rückgängig zu machen usw., das ist, wie es umgesetzt wurde.

In jedem Fall ist die App enthält somit unnötige Komplexität und Indirektheit, es schwieriger und langsamer zu ‚grok‘ zu machen und Änderungen und Verbesserungen an bestehenden Funktionen, in diesem Fall für wenig oder gar keinen realen Nutzen. Da ich das Projekt geerbt, habe ich neue Features ohne Undo umgesetzt und niemand irgendwelche Beschwerden gehabt hat.

Sie können auch festgestellt, die Reversi Bibliothek nützlich, wie einige andere zu haben scheint. Siehe [ http://www.codeproject.com/KB/dotnet/ reversibleundoredo.aspx] [1] oder [diese] [2]

[1]: http://www.codeproject.com/KB/dotnet /reversibleundoredo.aspx Machen Sie Ihre Anwendung Reversible Undo und Redo zur Unterstützung

[2]: http://www.codeproject.com /script/Articles/Article.aspx?aid=22502 Undo Redo

Abhängig von der Anzahl der Rückgängig-Ebene Sie haben möchten.

Sie können Werte speichern, bevor sie für jede der Kontrollen „committed“ in gewissem Sinne in eine Form Ebene Sammlung, die Sie auf einen Klick für den Benutzer „Restore“ können zurück zu gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top