Как подписаться на события других классов в c #? - PullRequest
18 голосов
/ 27 мая 2009

Простой сценарий: пользовательский класс, который вызывает событие. Я хочу использовать это событие внутри формы и реагировать на него. Как я могу это сделать? Примеры кода, пожалуйста!

Обратите внимание, что форма и пользовательский класс являются отдельными классами.

Ответы [ 3 ]

27 голосов
/ 27 мая 2009
        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.....
            }
        }
6 голосов
/ 27 мая 2009

Внутри вашей формы:

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

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

Вы просто подписываетесь на событие в другом классе так же, как и на событие в своей форме. Три важные вещи, которые нужно запомнить:

1) Вы должны убедиться, что ваш метод (обработчик события) имеет соответствующее объявление, соответствующее типу делегата события в другом классе.

2) Событие в другом классе должно быть для вас видимым (т. Е. Общедоступным или внутренним).

3) Подписаться на действительный экземпляр класса, а не на сам класс.

0 голосов
/ 27 мая 2009

Если ваше событие обрабатывается EventHandler, этот код работает:

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
}

Если для вашего «настраиваемого события» требуется какая-то другая подпись, вам нужно будет использовать ее вместо.

...