2013-09-12 4 views
5

Я заметил, в C# можно переопределить методы в виде() родительского класса, например, так:Как прошел параметр события?

protected override void OnPaint(PaintEventArgs e) 
    { 

    } 

Я не понимаю, как PaintEventArgs генерируется и как/когда он передается этой функции. Я должен предположить, что OnPaint() вызывается каждый раз, когда форма нуждается в перекраске.

Кроме того, при создании кнопки события нажатия клавиш они выглядят следующим образом:

private void button1_Click(object sender, EventArgs e) 
    { 

    } 

Еще раз, я не понимаю, как/почему эти параметры передаются при нажатии кнопка активируется.

+0

Один переопределяет защищенный виртуальный метод, а другой - типичный обработчик событий, который должен быть привязан к событию. Тот факт, что вы получили название «PaintEventArgs» в OnPaint, кажется мне абсолютной ленинностью/прагматизмом разработчиков и не соответствует никаким соглашениям. – flq

ответ

12

В этом нет ничего особенного. Базовый класс, который определяет Paint события содержит код, морально эквивалентный этот:

protected virtual void OnPaint(PaintEventArgs e) 
{  
    var paintHandlers = this.Paint; 
    if (paintHandlers != null) 
    { 
     paintHandlers(this, e); 
    } 
} 

OnPaint выполняет две функции:

  1. Вызывает Paint события, чтобы внешние абоненты могут быть уведомлены (это как гипотетический form1_Paint будет в конечном итоге вызывается).
  2. Lets производные классы непосредственно реагируют на события рисования без необходимости привлечения обработчика событий - просто переопределите метод (но производный класс не должен забывать вызвать базовую реализацию!).

Когда приходит время, чтобы поднять Paint событие, некоторый другой код в базовом классе создает PaintEventArgs экземпляр, основываясь на информации, под рукой, и называет OnPaint:

// ...somewhere in the class... 
OnPaint(new PaintEventArgs(...)); 

В частном случае, когда событие аргумент вводится как EventArgs, нет необходимости создавать новый экземпляр, вы можете напрямую передать статический член EventArgs.Empty в метод OnSomething.

Что касается , то когда это происходит: всякий раз, когда сообщение выводится из приложения message pump и его обработка указывает, что событие должно быть поднято. Вы также можете прочитать Understanding events and event handlers in C#.

1

Лучшее место, чтобы начать это (снова?) Ознакомиться с .Net "делегатов":

Например, если посмотреть на код для формы C# , вы можете увидеть что-то вроде этого:

private void btnGo_Click(object sender, EventArgs e) 
{ 
    // My code goes here... 

Теперь, если вы смотрели на соответствующий, автоматически генерируемой, .Design код, вы увидите что-то вроде этого:

private void InitializeComponent() 
{ 
    this.btnGo.Click += new System.EventHandler(this.btnGo_Click); 
    .... 

Синтаксис «+ =» назначает ваш настраиваемый обработчик событий кнопке. Любое учебное пособие по «делегатам» (, включая ссылка, приведенная выше) даст вам более подробную информацию о том, как и почему это работает.

Я надеюсь, что помогает .. PSM

+0

-1 для публикации ссылки .NET 1.1. Что происходит, когда читатель начинает нажимать ссылки с этой страницы? –

+0

Я бы поддержал этот ответ, если он немного уточнил делегатов ... –

+1

@retailcoder - спасибо - я работал над этим, когда мое подключение к Интернету заглохло. Обновлено сейчас :) – paulsm4

1

В случае обработчика события нажатия кнопки, синтаксис object sender, EventArgs e позволяет несколько кнопок, чтобы быть подключены к одному обработчику событий. Это возможно, потому что sender - это объект, который инициировал событие, поэтому вы можете отличить, если кнопка button1, button2 или button3 инициировала событие.

А поскольку sender является object, то вы, вероятно, может иметь один обработчик щелчка, который обрабатывает все элементы страницы, которые были интерактивными и иметь кучу условной логики в обработчике для переключения на основе того, какой тип управления инициировал событие ; это не рекомендуется.

Смежные вопросы