2010-12-02 13 views
2

カスタムコントロールでカスタムイベントmyEventを定義したとしましょう。イベントが発生すると、このイベントは親フォームによって取得されます。Winformカスタムコントロールが別のWinformカスタムコントロールに通知する方法

同じ親フォームにある別のカスタムコントロールでこのイベントをキャプチャするにはどうすればよいですか?私は他のコントロールが何とか最初のコントロールイベントを購読したいと思います。

答えて

3

私はMVCを扱うときに同様の状況に遭遇しました。私がそれを扱う方法は、コントローラーでメディエーターのデザインパターンを使用することです。

基本的に、登録機能と通知機能を持つクラスがあります。 register関数は、リスナーインタフェースとmessageIdを実装するオブジェクトを取ります。これらを辞書に格納します。 notify関数は、リスナーに送信する必要があるイベントのmessageIdを取り、適切なイベントにイベントが発生したことを通知します。

だから多分

public interface IListener 
{ 
void MessageRaised(int messageId, params object[] arguments); 
} 

public class Mediator 
{ 
public void Register(IListener listener, int messageId) 
{ 
//... add to dictionary of arrays for each messageId 
} 

public void NotifyListeners(int messageId, params object[] arguments) 
{ 
//... loop through listeners for the messageId and call the MessageRaised function for each one 
} 
} 

の線に沿って何かを今通常、私はベースコントローラを持っており、それは静的メディエータオブジェクトを実装します。それから、私の他のすべてのコントローラーはそれを継承します。コードを使用していて継承できない場合は、シングルトンパターンを使用してみてください。 .Net静的クラスはコンストラクタを持っているのでかなり使いやすくなっています。

あなたのケースでは、各コントロールのIListenerを実装するコードがあり、それぞれのコンストラクタにMediator.GetInstance()のようなコードがあります。登録(this、Messages.MyEvent)。これは、少し早くリファクタリングして、もう少し再利用できるようにするためのものです。迅速なGoogle検索から

一部のリソース

http://www.avajava.com/tutorials/lessons/mediator-pattern.html

http://sourcemaking.com/design_patterns/mediator

幸運

1

あなたはVIA両方のコントロールの親コントロールは、マルチプレクサとして機能し、そのためにイベント処理とデリゲートを使用して、Receiverコントロールがあなたの送信者のコントロールのイベントに間接的にを購読する必要があり、ことができます。

0

答えは簡単です。 2番目の形式(イベントのない形式)のメソッドを正しい署名で宣言し、公開としてマークします。

親フォームでは、2番目のフォームのメソッドを最初のイベントのイベントに割り当てます。

0

はいだけの公開やイベントを高め、あなたのリスナー制御からそれを購読してください。

関連する問題