0

デザイナー ツールボックスにあるSystem.Windows.Forms.TreeViewから派生した独自のカスタム コントロールがあります。

このカスタム コントロールのインスタンスを (デザイナーを使用して) フォームに追加します。

継承されたコントロールを作成した目的は、コントロール自体がそのイベントを処理できるようにすることです。これは、標準の MVC デザインでビューとして機能することになっているためです。つまり、ツリービューのノード選択が変更されたときに、ビューがModelとのすべての対話を処理するようにします。

問題は、(デザイナーを使用して) カスタム コントロールのイベントを追加すると、そのイベントが MainForm クラスに追加されることです。このような場合の唯一のオプションは、すべてのイベントをカスタム コントロールに転送することですが、これはあまり最適ではありません。

イベントが追加されるクラスを制御する方法はありますか? MainForm の自動生成されたコードを編集して、カスタム コントロールでトリガーされるイベントを作成できるため、技術的に可能であることはわかっています。しかし、それは明らかに適切な解決策ではありません。

ありがとう。

4

2 に答える 2

2

派生クラスのいくつかのメソッドをオーバーライドしてみませんか。たとえば:

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
    {
    }
于 2009-09-30T13:12:37.457 に答える
1

トム・フライは正しい。特定のイベントの動作を、通常はイベントを発生させるクラスで処理する場合は、イベントを発生させる適切なメソッドをオーバーライドしてタスクを実行することをお勧めします。総合馬術のインフラストラクチャはやり過ぎであり、ここでやろうとしていることのために実際に設計されていません。

その理由は、ビューのすべてのインスタンスでこれらのアクションを実行する必要があるためです。これらのアクションが、実行時にビューの外部のもの(イベントの目的)によって動的に割り当てられ、決定されることは望ましくありません。

ただし、このようなオーバーライドを実行するときに含める重要なことの1つは、ベースの実装の呼び出しです。そうしないと、奇妙なエラーが発生する可能性があります。

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
{
    // Do stuff you want done before here
    base.OnNodeMouseClick(e);
    // Do stuff you want done after here
}

基本クラスを呼び出すと、イベントが発生し、他のアクションが実行される場合があります。イベントが発生する前に何かを実行したい場合、外部サブスクライバーがその処理を実行する場合は、ベースへの呼び出しの前にそれを配置します。すべてのイベントが発生して処理された後で何かを実行したい場合は、後で実行してください。不自然な例:コントロールがデータバインディングを処理した場合、baseの呼び出しの前にデータバインディングが存在することを確認し、後で有効であることを確認することができます(ハンドラーが何かを変更した場合)。

MSDNから:

このOnNodeMouseClickメソッドでは、派生クラスがデリゲートをアタッチせずにイベントを処理することもできます。 これは、派生クラスでイベントを処理するための推奨される手法です。

相続人へのメモ:

派生クラスでオーバーライドする場合は、登録されたデリゲートがイベントを受信できるようOnNodeMouseClickに、必ず基本クラスのメソッドを呼び出してください。OnNodeMouseClick

于 2009-09-30T13:24:43.953 に答える