Form_Load () 'event' или Override OnLoad () - PullRequest
25 голосов
/ 08 сентября 2010

Я бы хотел, чтобы кто-то попытался объяснить разницу между ними. Более конкретно, пример использования сценария.

Я выполняю рефакторинг некоторого кода Windows Form , а Form имеет некоторый код в событии Form_Load(), а также в событии protected override void OnLoad(), которое вызывает base.OnLoad(e); Теперь я отследил его и переопределил сначала срабатывает, а затем сразу же запускает версию события.

Итак, какой из них обычно используется и почему?

Ответы [ 3 ]

26 голосов
/ 08 сентября 2010

Вы всегда должны переопределять OnLoad (). Использование события подходит только тогда, когда другой класс будет заинтересован в событии. Для чего и нужны события. Другой класс, который интересуется событием Load, встречается очень редко, он действительно полезен для выполнения операций по размещению окон.

Тем не менее, событие Load хорошо работает с дизайнером, и программисты VB6 очень довольны им. Это не так уж и плохо, у вас могут возникнуть проблемы только тогда, когда вы начнете наследовать форму, а код не будет работать в правильном порядке.

Большая часть кода, который теперь вставляется в событие Load, действительно принадлежит конструктору. Вам нужно только OnLoad, если:

  • Вам необходимо знать точный размер и положение окна. Лучше всего использовать OnLoad, окно-дескриптор создано, применяются пользовательские настройки (размер заголовка и границы), а форма была изменена в соответствии с указаниями свойства Form.AutoScaleMode. Окно еще не видно, очень хорошее время, чтобы переместить окно в другое место или расположить дочерние элементы управления.
  • У вас есть код, которому нужно свойство Handle. Это тонко, вы не всегда можете сказать. Наличие такого кода в конструкторе вредно для здоровья, окно создается до завершения работы конструктора. Обычно это подходит к хорошему концу, но это может сделать создание формы очень медленным. Легко диагностировать из окна Call Stack.
  • Чтобы избежать ошибки в реализации MDI. Если вы создадите дочерний MDI в родительском конструкторе, вы получите дублированные глифы, видимые при максимизации дочернего элемента. Вместо этого создайте ребенка в OnLoad.
2 голосов
/ 08 сентября 2010

При переопределении OnLoad вызов base.OnLoad вызывает Load событие формы.

protected override void OnLoad(EventArgs e)
{
  // do stuff before Load-event is raised
  base.OnLoad(e);
  // do stuff after Load-event was raised
}

Если вам не требуется выполнять какие-либо действия перед событием Loadпосле того, как base.OnLoad(e) дает то же поведение во время выполнения, что и размещение в обработчике события Form_Load.

Я бы рекомендовал переопределить метод, а неподписаться на событие.

0 голосов
/ 08 сентября 2010

OnLoad вызывает событие Load , которое обрабатывается Form_Load.См. Статью MSDN .

Итак, в своем коде в конце функции инициализации вы можете вызвать функцию OnLoad.Затем базовый класс вызовет ваши обработчики событий (в данном случае Form_Load), которые вы, возможно, установили в своем коде инициализации.

Лично я поместил бы свой код в Form_Init и оставил бы OnLoad для инициирования события, поскольку я занимаюсь этим событием, хотя вы можете защищать любое из них по уважительной причине, как вы видите из своих ответов.

...