2009-05-27 13 views
17

シンプルなシナリオ:イベントを発生させるカスタムクラス。このイベントをフォーム内で消費し、それに反応したいと思います。それ、どうやったら出来るの?コード例、してください!C#で他のクラスのイベントを購読するには?

フォームとカスタムクラスは別のクラスであることに注意してください。フォーム内

答えて

24
 public class EventThrower 
     { 
      public delegate void EventHandler(object sender, EventArgs args) ; 
      public event EventHandler ThrowEvent = delegate{}; 

      public void SomethingHappened() 
      { 
       ThrowEvent(this, new EventArgs()); 
      } 
     } 

     public class EventSubscriber 
     { 
      private EventThrower _Thrower; 

      public EventSubscriber() 
      { 
       _Thrower = new EventThrower(); 
       //using lambda expression..could use method like other answers on here 
       _Thrower.ThrowEvent += (sender, args) => { DoSomething(); }; 
      } 

      private void DoSomething() 
      { 
       //Handle event..... 
      } 
     } 
+0

すばらしいソリューションをありがとう。私は質問を投稿した直後にそれを理解しました。私の解決策はあなたと非常に似ています。 – sarsnake

+0

http://stackoverflow.com/questions/8335131/winform-events-in-another-class-net2-simplify-delegate .NET2での実装 –

+0

@CSgarpAtlこれは正解として選択されています。残念ながら、私はすべてのステップに従っていても動作させることはできません。私は私のメインフォームが自分のユーザーコントロールで起こった方法を認識するようにしようとしています。 – Disasterkid

6

void SubscribeToEvent(OtherClass theInstance) 
{ 
    theInstance.SomeEvent += this.MyEventHandler; 
} 

void MyEventHandler(object sender, EventArgs args) 
{ 
    // Do something on the event 
} 

あなただけの他のクラスのイベントにあなたの形式でイベントをするためにするのと同じ方法をサブスクライブします。

1)メソッド(イベントハンドラ)に、他のクラスのイベントのデリゲートタイプと一致する適切な宣言があることを確認する必要があります。

2)他のクラスのイベントがあなたに見えるようにする必要があります(例:公開または内部)。

3)クラス自体ではなく、クラスの有効なインスタンスをサブスクライブします。

+0

@Reed_Copseyはオユは何とか私のイベントは、私はあなたの問題が何であるかを知らない@Gobliinsハンドラ – Gobliins

+0

によって受理されませんいくつかのより多くのコードを提供することができる - 私は完全な詳細と、独自の質問を推薦します。 –

+0

それはトピックと同じ問題ですが、nvm私はすでにそれを解決しました。 – Gobliins

0

はあなたのイベントのイベントハンドラによって処理されると仮定すると、このコードは動作します:あなたの「カスタムイベントは、」処理するためにいくつかの他の署名を必要とする場合

protected void Page_Load(object sender, EventArgs e) 
{ 
    MyClass myObj = new MyClass(); 
    myObj.MyEvent += new EventHandler(this.HandleCustomEvent); 
} 

private void HandleCustomEvent(object sender, EventArgs e) 
{ 
    //handle the event 
} 

、あなたが代わりにそのいずれかを使用する必要があります。

関連する問題