1

それは私がしばらく自問してきた質問です。

イベントの特定の流れを与えて、そのうちの1つを処理するときに、次に発生するイベントを停止できますか?

たとえば、ツリービュー(winform) で子が選択されたノードを折りたたむと、次のようにイベントが発生します。

  • 前折りたたむ
  • 選択前
  • AfterSelect
  • AfterCollapse

クラスメンバーを使用してそれらを停止することはできましたが、イベントキューに直接作用することにより、組み込み関数またはこれを達成するための別の方法 (よりエレガントな方法) があるかどうか疑問に思っていました.

何か案が?

4

5 に答える 5

1

簡単ではありません。イベントの発生順序は TreeView コントロール クラスによって制御され、イベントの発生を防ぐ組み込みの方法はありません。ただし、いくつかのオプションがあります。

  1. 基本クラスから継承する独自の TreeView クラスを作成し、boolプロパティを追加してイベントが処理されないようにします。次に、などをオーバーライドBeforeCollapseして、を呼び出す前に bool をチェックできますbase.BeforeCollapse
  2. フラグを作成しbool、各イベントでフラグを確認するだけです。
于 2012-05-23T13:09:43.027 に答える
0

OnBeforeCollapseによると、プロパティを持つTreeViewCancelEventArgsを取得しますCancel。これを true に設定すると、フローが停止しますが、折りたたまれません。についても同様ですOnBeforeSelect

于 2012-05-23T13:10:29.247 に答える
0

イベントを簡単に "キャンセル" できるのは、イベント ハンドラーにCancelEventHandlerデリゲート型がある場合だけです。それでも、サブスクライブされたすべてのイベントの実行をスキップする残りのイベントのフラグを設定するほど、実際にはキャンセルしません。

タイプを持っていた場合(CancelEventHandlerこれらにはありません) Cancel、ハンドラー内のイベント オブジェクト自体に true を設定するだけです。

他の多くの回答が、何をすべきかについての提案を提供します。私はちょうどあなたの考えに行きます:あなたのコントロールクラスに「イベントキャンセル」フラグを設定し、それをチェックしてください。シリーズの最後のイベントが呼び出されたら、リセットします。

于 2012-05-23T13:11:36.760 に答える
0

いいえ、そのタイプのイベントに対してそれを行う方法はありません(TreeView を求めています)。

たとえば、組み込みメカニズムを介してKeyEventArgs.Handledを管理できます。

いくつかのインスタンス (ブール値?) 値を使用してフローを管理できます。

または、これ以上受信したくないイベントの購読を解除できますが、再度購読した後です。大まかな解決策のように聞こえますが、合理的な解決策になることもあります。

于 2012-05-23T13:06:42.510 に答える
0

イベントが発生しても、イベント ハンドラーをそれらにバインドしないと何も起こりません。この場合、以下のコードを使用してハンドラーを削除できます。

object.Event -= new EventHandlerType(your_Method)

それ以外の場合は、独自のカスタム コントロールを作成する必要があります

于 2012-05-23T13:07:19.303 に答える