Какая польза от отправителя объекта и параметров EventArgs e?

В случае Page_Load, Init и других событий страницы, какая польза от этих (object sender, EventArgs e) параметров?

Примеры были бы более полезными.


person Qasim    schedule 23.01.2013    source источник


Ответы (2)


EventArgs e — это параметр с именем e, который содержит данные события. Дополнительную информацию см. на странице EventArgs MSDN.

Object Sender — это параметр с именем Sender, который содержит ссылку на элемент управления/объект, вызвавший событие.

Класс Event Arg: http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

Пример:

protected void btn_Click (object sender, EventArgs e){
   Button btn = sender as Button;
   btn.Text = "clicked!";
}

Изменить: при нажатии кнопки срабатывает обработчик события btn_Click. Часть «отправитель объекта» будет ссылкой на кнопку, которая была нажата.

person Vinayak Pahalwan    schedule 23.01.2013
comment
Но как отправитель связан с кнопкой? Где строятся отношения между sender и btn? - person Eduardo Pignatelli; 02.03.2018
comment
@EduardoPignatelli, связь между «отправителем» и «кнопкой» в иерархии наследования заключается в том, что они оба являются типами «объектов». «Отправитель» — это просто оболочка для типа «объект». При распаковке во время выполнения базовый экземпляр упакованного объекта проецируется в захватывающий класс. В данном случае «Кнопка». Если ожидаемый класс не соответствует распакованному объекту, создается исключение. - person Leo Gurdian; 09.03.2018

Эти два параметра (или варианты) отправляются по соглашению со всеми событиями.

  • sender: объект, вызвавший событие
  • e экземпляр EventArgs, включая во многих случаях объект, наследуемый от EventArgs. Содержит дополнительную информацию о событии и иногда предоставляет возможность коду, обрабатывающему событие, каким-либо образом изменить его.

В случае упомянутых вами событий ни один из параметров не является особенно полезным. Это только одна страница, поднимающая события, а EventArgs - это Empty, поскольку дополнительной информации о событии нет.

Рассмотрим два параметра по отдельности, вот несколько примеров, когда они полезны.

sender

Скажем, у вас есть несколько кнопок на форме. Эти кнопки могут содержать Tag, описывающее, что должно делать нажатие на них. Вы можете обрабатывать все события Click одним и тем же обработчиком и в зависимости от sender делать что-то другое.

private void HandleButtonClick(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    if(btn.Tag == "Hello")
      MessageBox.Show("Hello")
    else if(btn.Tag == "Goodbye")
       Application.Exit();
    // etc.
}

Отказ от ответственности: это надуманный пример; не делай этого!

e

Некоторые события можно отменить. Они посылают CancelEventArgs вместо EventArgs. Этот объект добавляет простое логическое свойство Cancel в аргументы события. Код, обрабатывающий это событие, может отменить событие:

private void HandleCancellableEvent(object sender, CancelEventArgs e)
{
    if(/* some condition*/)
    {
       // Cancel this event
       e.Cancel = true;
    }
}
person Jamiec    schedule 23.01.2013
comment
+1 для отменяемых событий. Какие есть реальные примеры из мира приложений Windows? Спасибо. - person Sabuncu; 01.02.2014
comment
@DaveKelly Спасибо. - person Sabuncu; 02.06.2016