web-dev-qa-db-ja.com

C#で他のクラスのイベントをサブスクライブするにはどうすればよいですか?

単純なシナリオ:イベントを発生させるカスタムクラス。このイベントをフォーム内で消費し、それに反応したいと思います。

それ、どうやったら出来るの?

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

18
sarsnake
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.....
    }
}
27
CSharpAtl

フォーム内:

private void SubscribeToEvent(OtherClass theInstance) => theInstance.SomeEvent += this.MyEventHandler;

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

フォームのイベントにサブスクライブするのと同じ方法で、他のクラスのイベントにサブスクライブするだけです。覚えておくべき3つの重要なこと:

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

  2. 他のクラスのイベントは、あなたに表示される必要があります(つまり、パブリックまたは内部)。

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

6
Reed Copsey

イベントがEventHandlerによって処理されると仮定すると、このコードは機能します。

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

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

「カスタムイベント」で処理するために他の署名が必要な場合は、代わりにその署名を使用する必要があります。

0
Rex M