勝利フォームに特定の入力フィールドがあり、ユーザーが何らかのデータを入力/再入力したとします。.NETアプリケーションで '取り消し'操作を実装する方法は?
「元に戻す」操作で以前に入力したデータを保持する方法はありますか?
私はそれを達成するための最良の方法を知りたいだけです。
勝利フォームに特定の入力フィールドがあり、ユーザーが何らかのデータを入力/再入力したとします。.NETアプリケーションで '取り消し'操作を実装する方法は?
「元に戻す」操作で以前に入力したデータを保持する方法はありますか?
私はそれを達成するための最良の方法を知りたいだけです。
いくつかのオプションがあります。重要なことは、プロジェクトの初期段階で設計を開始することです。既存のプロジェクトに追加しようとすると、この機能を考慮して設計されていないと、非常にとなる可能性があります。
はあなたを利用したいと思ういくつかの基本的なパターンがあります。最初の鍵は、あなたの高水準アーキテクチャの宗教的またはパターン - 熱狂的な実装ではありません。 がであることは、ソフトウェアが現在の状態と表示されている状態の違いを認識し、適切に切り離すことが重要です。ビジュアル状態とアプリケーション状態の間には、共通の、明確に定義された結合が必要です。これは、コマンドを作成するのに必要な共通のアーキテクチャを提供します(#2を参照)。
Commandパターン。コマンドパターンで多くの品質を得ることができます(ただし、ウィザードで生成する必要があるコードのコストがかかります)。コマンドパターンに具体的に取り組む方法は変わるかもしれません(例:イベントハンドラを使った実装の場合は、コマンドごとに1つのクラスとオーバーライドを使って1つのクラスを1つのクラスから複数のコマンドに渡します)。しかし、コマンドは@Ralphがスタックを構成することを提案した "まわり。
これはややこしいかもしれませんが、一般的なアプローチは、ビジュアル状態からアプリ状態にデータを「コミット」するイベントをリッスンすることです。 Validated
イベントはTextbox
の良いフックかもしれません。 Click
イベントは、Button
の方が理にかなっています。そのコミットが発生すると、そのコントロールに関連付けられたコマンドを作成し、コマンドを実行しようとし、コマンドが正常に完了すると、そのコマンドを元に戻すスタックに追加します。今、何が起きているのか、まさにそれが起こっているのかを正確に追跡しています。
Mementoパターン。 @JPパズルの最後の部分を取り出しました。コマンドを実行する前に、保存したコマンドのメモを使用して、影響を受けたコントロールの状態を保存することができます。これはコマンドのインターフェイスにあるUnExecute()
のメンバーと組み合わされ、タスクを実行するために必要なデザインの最後のコアとなるはずです。
このような構造化されたアプローチの良いところは、あなたが今、コマンドベースで発生する必要のある追加の行動のための自然な拡張ポイントを持っているということです。トランザクションは、例えば、自然な適合です。私の現在のプロジェクトでは、WPF ICommand
インターフェイス(私のwinformsプロジェクト内)を使用して、与えられたコマンドCanExecute()
が与えられているかどうかについてのフィードバックを提供しています。これにより、純粋にコマンド駆動型の方法でUIウィジェットを適切に有効または無効にすることができます。 :)
残念なことに、Winformsに組み込まれているこの構造には(私が知る限り)たくさんのサポートがないので、ほとんどを最初から構築する必要があります。単一の部分は特に複雑ではありませんが、コマンドごとに大部分の定型コードを生成することができます。また、普及した設計手法です。効果的であるためには、アプリケーションの適切な部分全体にわたって一貫して使用する必要があります。これにより、特に元のコードが密接に結合され、不粘着性である場合に、機能をかなり高価に改装することができます。
いくつのレベルの元に戻したいかによって異なります。
値が「コミット」される前に、各コントロールのフォームレベルのコレクションに格納することができます。これは、ユーザーが戻るためにボタンをクリックすると「復元」できます。
WinForms/.Netに利用できる組み込みの元に戻す機能があるかどうかは分かりません。しかし、実際に探しているのは、アクションのリストを管理するのに役立つStackデータ構造です。ユーザーが実行できるアクションを表現するために、そしてスタックにこれらのアクションをプッシュする必要のあるアプリケーションを進めるときに、何らかのタイプの「アクション」オブジェクトを作成する必要があります。アンドゥボタンまたはCtrl-Zを押すか、または元に戻すアクションを開始する方法があれば、現在のアクションをポップアウトし、アプリケーションの状態を前のアクションに戻します。
これはこれがどのように機能するかについての非常に基本的で概要の概要ですが、このような機能の実装は非常に複雑になる可能性があります。 Adobe Photoshopのようなプログラムでどのように動作する必要があるか想像してみてください。 :
CTRL + Zは個々のコントロールで機能します。
データとBindingSourceを操作する場合は、CancelEdit関数を呼び出して、永続化されていない変更をレコードに「元に戻す」ことができます。あるいは、データベースのデータをリロードすることもできます。
これは、達成しようとしていることに応じて移動する最善の方法ではないかもしれませんが、richtextboxを使用して、そのコントロールに組み込まれているundoメソッドを呼び出すことができます。例えば
:
私の提案は、設計および実装を開始する前に、特定のUNDO要件とその実際的な利益を決定することです。私は内部的にジェネリックな "アクション"オブジェクトのスタックを介して複数のオペレーションを順番に取り消すWinFormsアプリケーションを継承しました。しかし、私が使用したアプリのユーザーの誰もその機能を使用していないことが判明しました。そして、この特定のアプリが動作する方法は、私がアプリのユーザーだった場合、私は自分自身もこの機能を使用して表示されませんでした。
「元に戻す」機能が、この場合「選択的」なアンドゥだった場合は、より便利でした。ユーザは、最後の操作を最初に元に戻すことができるだけでなく、2回目から最後の操作を取り消すことができる代わりに、データコミットの前に行われたいくつかの前の編集の任意の単一の操作/編集を選択し、その単一の編集を元の状態に復元することができる、それはどのように実装されたかです。
いずれの場合でも、アプリケーションには不要な複雑さと間接性が含まれているため、現実的な利益がほとんどないか、まったくないため、「grok」して既存の機能を変更したり拡張したりするのがますます困難になります。私はプロジェクトを継承して以来、私は元に戻すことなく新しい機能を実装しており、誰も苦情を受けていません。
Reversiライブラリが役に立つかもしれませんが、他にもいくつかあるようです。[http://www.codeproject.com/KB/dotnet/reversibleundoredo.aspx][1]を参照するか、[この] [2]
[1]:http://www.codeproject.com/KB/dotnet/reversibleundoredo.aspx元に戻すをサポートし、
[2]やり直すに対してアプリケーションがリバーシブルください:http://www.codeproject.com/script/Articles/Article.aspx?aid=22502元に戻すやり直し
私はを明らかにスペースのためにここでいくつかの細部を覆しているが、重要な部分はすべてそこにあると思う。 :) –