Подтвердить что ты не робот

Какой код установки должен идти в Form Constructors по сравнению с событием Form Load?

Для приложений winforms мне интересно, какой код установки должен быть включен:

  • MainForm()

в отличие от

  • MainForm_Load (отправитель объекта, EventArgs e)

Здесь есть рекомендации по лучшей практике?

4b9b3361

Ответ 1

Программисты, работавшие с VB6, как правило, помещают много кода в событие Load, в VB6 это событие использовалось для инициализации формы. Но это больше не подходит в Windows Forms, класс Form может иметь конструктор. Способ .NET - инициализировать объекты класса в конструкторе, есть очень мало веских причин не делать этого для класса Form.

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

Значения свойств Размер и Расположение во время разработки формы не совпадают с их фактическими значениями, когда форма запускается на другом компьютере. Форма может быть изменена в соответствии с размером системного шрифта или настройкой DPI видеоадаптера на целевом компьютере. Пользовательские настройки также играют роль, пользователь мог выбрать другой размер шрифта для заголовка окна. Обычно вас это не волнует, если только вы не хотите, чтобы окно занимало определенную позицию на рабочем столе или не было выровнено с каким-либо другим окном.

Написание кода в событии Load, который выполняет инициализацию элементов управления TreeView или ListView, может значительно замедлить время запуска. Когда вы делаете это в конструкторе, Windows Forms еще не нужно обновлять физическое окно, оно еще не было создано. После создания собственного элемента управления Winforms инициализирует его массовым обновлением вместо одного узла/элемента за раз, как это происходит при выполнении кода в событии Load. Большая разница.

И последнее, но не менее важное: вы никогда не должны использовать событие Load, вы должны переопределить метод OnLoad(). Это гарантирует, что код выполняется в предсказуемом порядке, когда вы (или кто-то еще) наследуетесь от вашего класса Form. IntelliSense поможет вам написать этот метод, просто введите "protected onl" и нажмите вкладку, чтобы IntelliSense автоматически завершил метод. Обратите внимание, как у вас есть возможность поместить код до или после вызова base.OnLoad(), то есть как вы управляете тем, кто является боссом. Вы являетесь боссом, когда ставите его после, не часто правильный выбор, кстати.

Ответ 2

Быстро посмотрите Использовать конструктор в Windows Forms для обеспечения правильной инициализации

Использование конструктора в форме Windows для обеспечения инициализации сделано правильно. Порядок ведения огня - это не точная наука, и вы не можете всегда зависят от порядка, в котором огонь событий, независимо от того, что вы видели в прошлом.

....

По этой причине Microsoft рекомендует обрабатывать код инициализации в Формах Конструктор, предполагая, что вы не имеют действительно время инициализации, которая могла бы получить нарезанный по времени или DoEvents().