Как подписаться на события других классов в С#?

Простой сценарий: пользовательский класс, вызывающий событие. Я хочу использовать это событие внутри формы и реагировать на него.

Как я могу это сделать?

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


person sarsnake    schedule 27.05.2009    source источник


Ответы (3)


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

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

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

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

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

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

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

person Reed Copsey    schedule 27.05.2009
comment
@Reed_Copsey Можете ли вы предоставить еще немного кода, почему-то мое событие не будет принято обработчиком - person Gobliins; 13.12.2012
comment
@Gobliins Я не знаю, в чем ваша проблема - я бы порекомендовал задать свой вопрос с полной информацией. - person Reed Copsey; 13.12.2012
comment
Это та же проблема, что и в теме, но я уже решил ее. - person Gobliins; 17.12.2012

Предполагая, что ваше событие обрабатывается 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
}

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

person Rex M    schedule 27.05.2009

person    schedule
comment
Спасибо за отличное решение. Я понял это сразу после того, как разместил вопрос, и мое решение очень похоже на ваше. - person sarsnake; 27.05.2009
comment
stackoverflow.com/ вопросов/8335131/ для реализации в .NET2 - person Dave Mateer; 01.12.2011
comment
@CSgarpAtl Я вижу, что это выбрано как правильный ответ. К сожалению, я не могу заставить его работать, хотя я следил за каждым шагом. Я пытаюсь сообщить своей основной форме о методе, который произошел в моем пользовательском элементе управления. - person disasterkid; 02.07.2014