Erweitern Sie diese Klasse in einer Listenansicht auf Rückgängig / Wiederherstellen

8

Ich verwende einen dritten Gruppencode, um Rückgängig- / Wiederherstellungsvorgänge in einem WindowsForm-Projekt zu verwalten.

Ich muss die Klasse erweitern, um Vorgänge in einer Listenansicht rückgängig zu machen, das heißt:

· Rückgängig / Wiederherstellen Hinzufügen / Löschen von Elementen und Unterelementen

· Rückgängig / Wiederherstellen Aktivieren / Deaktivieren Sie die Zeilen

· Rückgängig machen / Wiederholen einiger wichtiger Dinge, die ich vielleicht verpasst habe

Ich weiß nicht, wie ich damit anfangen soll, der Code ist zu komplex für mich, jegliche Hilfe / Tipps / Beispiele dazu wären für mich sehr befriedigend, aber in 3 Monaten konnte ich das nicht durchführen ändern, ich denke, ich brauche gute Erklärungen oder vollständige Beispiele, hier ist der Code:

%Vor%

Ссылка

(Ich habe den Code hier nicht gepostet, weil er die 30.000-Zeichen-Grenze von StackOverflow überschreitet)

  

UPDATE:

Dies sind einige nützliche Informationen vom Autor, die die Dinge erklären, die ich tun muss, um den Listview-Support hinzuzufügen, aber wirklich kann ich nicht von mir selbst:

  

Die Funktionalität für eine Listenansicht sollte übrigens nicht so schwer sein   und auch ein guter Weg, um zu verstehen, wie es funktioniert. Das müsstest du tun   Erstellen Sie einen neuen Monitor, der die Ereignisse für die Änderung der Listenansicht erfasst und   Speichere den aktuellen Wert, bevor er geändert wird. Ein Befehl wird erstellt, wenn   Sie erkennen, dass eine Änderung mit allen Informationen durchgeführt wurde, die zum Rückgängigmachen oder Rückgängigmachen erforderlich sind   Wiederholen Sie die Aktion. Das ist es. Solange Ihr Monitor und Befehl erben   Von den Basisklassen wird es automatisch erkannt und verwendet.

Ссылка

UPDATE:

Der Besitzer der Klasse hat den Code aktualisiert, indem er eines der Dinge hinzugefügt hat, die ich benötigt habe, das Label-Item Rückgängigmachen / Wiederherstellen, nach dem ich gefragt habe.

· Rückgängig / Wiederholen Textänderungen in Listview (Normalmodus oder Detailmodus)

Leider ist dieses Update für mich nicht ausreichend, um die anderen Undo / Redo-Operationen hinzufügen zu können, die ich brauche. Bitte lesen Sie @Plutonix Kommentare, die Dinge erklären

Hier ist der Teil der aktualisierten Klasse für jemanden, der Ideen aufnehmen und helfen kann, sie zu erweitern:

%Vor%
  

UPDATE 2:

Das hat der Autor darüber gesagt, wie man die Funktionalitäten hinzufügt, die ich für die Operationen listview undo / redo benötige:

  

Ich glaube nicht, dass Sie die ganze Klasse neu schreiben müssen. Der schwierigste Teil von   Dies ist eine Möglichkeit herauszufinden, wann ein Gegenstand in Frage kommt   Entfernung und wenn es tatsächlich gelöscht wird. Im ListViewMonitor du   muss die notwendigen Event-Handler hinzufügen (In der Quelle, wo Sie   finde den AddHandler für BeforeLabelEdit und AfterLabelEdit). Für die   Die Befehlsklasse benötigt das tatsächliche ListViewItem und die   Position des Elements in der ListView, bevor es entfernt wurde. Sie können   einfach erstellen Sie Ihre Struktur mit dieser Information, etwas wie   ListViewItemRemoveUndoRedoData. Wenn Sie die Entfernung rückgängig machen, Sie einfach   Fügen Sie das gespeicherte ListViewItem der ListView an der Position hinzu, die Sie gespeichert haben   damit. Ich würde vorschlagen, einen zusätzlichen Count hinzuzufügen   ListViewItemRemoveUndoRedoData-Struktur, die die Anzahl von enthält   Elemente in der Listenansicht. Außerdem denke ich, dass das einzige Ereignis ist, das du brauchst   SelectedIndexChanged. Wenn dieses Ereignis eintritt, gibt es 2 Situationen.

     

1- Die Anzahl der Elemente entspricht der zuvor gespeicherten Anzahl (setzen Sie sie auf -1 oder etwas bei der Erstellung des Monitors): Sie speichern das Element,   Position und die Gesamtzahl der Artikel.

     

2- Die Anzahl der Elemente ist kleiner als die Anzahl, die Sie zuvor gespeichert haben: Ein Element wird entfernt und Sie richten sein UndoRedoCommand so ein, dass es rückgängig gemacht werden kann.

     
  • Es gibt natürlich eine dritte Option, was bedeutet, dass ein Element hinzugefügt wird
  •   

Es braucht etwas Kreativität, um die richtigen Ereignisse zu finden und was es sein muss   gespeichert, um das Rückgängigmachen / Wiederholen durchzuführen. Es könnte sogar bedeuten, dass du es musst   Finden Sie eine alternative Listenansicht mit besseren Ereignissen und Unterstützung (die Sie   finden Sie hier auf Codeprojekt)

  

UPDATE 3:

Wenn ich versuche, der @ThorstenC-Lösung zu folgen, bekomme ich Probleme mit der RedoLastAction, es redigiert sogar, wenn ich zuerst nichts rückgängig mache.

Ich kann auch unendlich oft wiederholen, und es macht nur die letzte Aktion, ich meine. Wenn ich 3 verschiedene LV-Elemente rückgängig mache, dann kann ich nur das letzte hinzugefügte Element wiederholen.

· UndoManager-Klasse:

%Vor%

· Hauptformularcode:

%Vor%     
ElektroStudios 13.10.2013, 08:10
quelle

3 Antworten

1

Versuchen Sie diesen Ansatz: Vergessen Sie diese aktuelle Implementierung, beginnen Sie mit der Implementierung Ihrer eigenen Undo / Redo-Klasse.

Jede Methode, die etwas manipuliert, muss eigene Undo-Methoden erstellen.   Speichern Sie die Delegierten und rufen Sie sie bei Bedarf auf. Ich habe ein Beispiel mit einem einfachen Hinzufügen / Entfernen von Listview-Elementen gemacht.

%Vor%     
ThorstenC 30.10.2013, 10:16
quelle
5

Wenn Sie sich die Zeile 328 genau ansehen, behandelt sie bereits eine ListView. Fehlt es irgendwie?

    
Plutonix 13.10.2013 13:02
quelle
1

Ich verstehe. Es ist ein bisschen wie du definierst was ein "Redo" machen sollte. In Ihrem Fall möchten Sie einen Undo-Vorgang wiederholen. Standardmäßig wiederholt ein Wiederholen die letzte Aktion. Selbst wenn Sie etwas rückgängig machen, wird der Redo erneut zurückgesetzt. Versuchen Sie diesen Ansatz: Verstehen Sie das Codefragment nur als Bausteine. Die "RemoveItem" -Methode fügt keinen Code zum Undo / Redo-Stack hinzu - Fügen Sie dieses Undo Redo wie in der Add-Methode hinzu. Wenn Sie die Funktion 'Rückgängig machen' nicht rückgängig machen müssen, fügen Sie ein

hinzu %Vor%

To UndoManager und setzen Sie es, wenn Sie eine Rückgängig machen. Überprüfen Sie diese Eigenschaft in der Methode "Hinzufügen / Entfernen" und fügen Sie dem Stapel "Rückgängig / Wiederherstellen" nichts hinzu. Wie:

%Vor%

Damit erhalten Sie die Kontrolle darüber, was rückgängig gemacht werden kann. Sorry, dass ich diesmal keinen Quellcode bereitstellen kann.

    
ThorstenC 03.11.2013 10:31
quelle