.net Windowsアプリケーションで「元に戻す」操作を実装するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/800940

  •  03-07-2019
  •  | 
  •  

質問

Win フォームに特定の入力フィールドがあり、ユーザーが何らかのデータを入力または再入力すると仮定します。

「元に戻す」操作で以前に入力したデータを保持するにはどうすればよいですか?

それを達成するための最良の方法を知りたいだけです。

役に立ちましたか?

解決

いくつかのオプションがあります。重要なのは、プロジェクトの早い段階で設計を始めることです。既存のプロジェクトに追加しようとすると、 とても この機能を念頭に置いて設計されていない場合、高価になります。

活用したい基本的なパターンがいくつかあります。

  1. MVC または 観察者 パターン。最初の鍵は、高レベルのアーキテクチャの宗教的またはパターン狂信者の実装というよりも重要です。何 重要なのは、ソフトウェアが現在の状態と表示された状態の違いを認識し、適切に分離することです。視覚的な状態とアプリケーションの状態の間には、明確に定義された共通の結合が必要です。これにより、コマンドの作成に必要な共通のアーキテクチャが提供されます (#2 を参照)。

  2. 指示 パターン。コマンド パターンを使用すると、多くの品質が得られます (ただし、ウィザードで生成する必要があるように見えるコードが犠牲になる可能性があります)。コマンドパターンに対してとる具体的なアプローチは異なる場合があります(オーバーライドによる実装ではコマンドごとに1つのクラス、イベントハンドラーによる実装では多数のコマンドごとに1つのクラスなど)が、コマンドは@Ralphがスタックの構造化を提案した「アクション」クラスです。その周り。

    これは少し難しいかもしれませんが、一般的なアプローチは、ビジュアル状態からアプリの状態にデータを「コミット」するイベントをリッスンすることです。の Validated イベントは良いフックになるかもしれない Textbox. 。の Click イベントは、 Button. 。そのコミットが発生すると、そのコントロールに関連付けられたコマンドを作成し、そのコマンドの実行を試み、コマンドが正常に完了した場合はそのコマンドを元に戻すスタックに追加します。これで、何が起こっているのか、そしてそれが起こっているデータを正確に追跡できるようになりました。

  3. メメント パターン。@JP パズルの最後のピースを取り出しました。保存されたコマンドのメモを使用して、コマンドが実行される前の影響を受けるコントロールの状態を保存できます。これと組み合わせると、 UnExecute() コマンドのインターフェイス上のメンバーは、タスクを実行するために必要な設計の最後のコア部分である必要があります。

このような構造化されたアプローチの優れた点は、コマンドベースで実行する必要がある追加の動作のための自然な拡張ポイントが得られることです。たとえば、トランザクションは自然に適合します。現在のプロジェクトでは WPF を使用しています ICommand インターフェイス (winforms プロジェクト内) で、特定のコマンドが実行されたかどうかに関するフィードバックを提供します。 CanExecute() いつでも。これにより、純粋にコマンド駆動の方法で UI ウィジェットを適切に有効または無効にできるようになります。:)

残念なことに、Winforms に組み込まれているこの構造は (私の知る限り) あまりサポートされていないため、ほとんどを最初から構築する必要があります。特別に複雑な部分はありませんが、コマンドごとにかなりの量のほとんどが定型的なコードを生成することになります。これは広く普及しているデザイン手法でもあります。これを効果的にするには、アプリケーションの適切な部分全体で一貫して使用する必要があります。これにより、特に元のコードが緊密に結合していて一貫性がない場合、機能の改良にかなりのコストがかかります。

他のヒント

WinForms / .Netに利用できる組み込みのUndo機能があるかどうかはわかりません。ただし、実際に探しているのは、アクションのリストを管理するのに役立つStackデータ構造です。何らかのタイプの「アクション」を作成する必要があります。ユーザーが実行できるアクションを表すオブジェクト。アプリケーションを進行するにつれて、これらのアクションをスタックにプッシュする必要があります。元に戻すボタン、Ctrl-Z、または元に戻す操作を開始する任意の方法を押すと、現在の操作から飛び出し、アプリケーションの状態を前の操作に戻します。

これは、これがどのように機能するかについての非常に基本的かつ高レベルの概要ですが、そのような機能の実装は非常に複雑になると思います。 Adobe Photoshopなどのプログラムでどのように機能する必要があるかを想像してください。 :O

これは、達成しようとしている内容によっては最善の方法ではないかもしれませんが、リッチテキストボックスを使用して、そのコントロールに組み込まれている元に戻すメソッドを呼び出すことができます。

例:

richTextBox1.Undo();

これおよびこれが役立つ場合があります。

CTRL + Zは個々のコントロールで機能します。

データとBindingSourceを操作する場合、「元に戻す」ことができます。 CancelEdit 関数を使用するか、データベースのデータをリロードできます。

私の提案は、設計と実装を開始する前に、特定の取り消し要件とその実際的な利点を決定することです。私は、汎用の「アクション」スタックを介して複数の操作を順番に元に戻すWinFormsアプリを継承しました。内部的にオブジェクト。しかし、私が話をしたアプリのユーザーは誰も使用も機能の要求もしなかったことが判明しました!そして、この特定のアプリが機能する方法は、もし私がアプリのユーザーだったなら、私も機能を使用している自分を見ないでしょう。

「選択的」な取り消しであれば、この場合、取り消し機能はより便利でした。ユーザーは、最初の最後の操作、次に2番目から最後の操作のみを元に戻すことができるのではなく、データコミットの前に行われたいくつかの以前の編集の単一の操作/編集を選択し、その単一の編集を元の状態に復元できますなど、実装方法です。

いずれにせよ、このアプリには不必要な複雑さと間接性が含まれているため、「grok」を行い、既存の機能を変更および拡張することが難しくなります。この場合、実際のメリットはほとんどありません。プロジェクトを継承してから、元に戻すことなく新しい機能を実装しましたが、苦情はありませんでした。

Reversiライブラリも便利だと思うかもしれません。他にもいくつかあるようです。 [ http://www.codeproject.com/KB/dotnet/をご覧ください。 reversibleundoredo.aspx] [1] または[this] [2]

[1]: http://www.codeproject.com/KB/dotnet /reversibleundoredo.aspx アプリケーションをリバーシブルにして元に戻すとやり直しをサポートする

[2]: http://www.codeproject.com /script/Articles/Article.aspx?aid=22502 やり直しを元に戻す

どのくらいのレベルの取り消しを行うかによって異なります。

「コミット」される前に値を保存できます。ある意味では、各コントロールのフォームレベルのコレクションに入れて、「復元」できます。ユーザーが戻るボタンをクリックすると。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top