Событие Form.Load срабатывает каждый раз - PullRequest
4 голосов
/ 15 марта 2011

Мне было интересно, правильно ли я поступаю.

Я создаю экземпляр Form (давайте назовем это Form_B) внутри моего класса (также формы) и обрабатываю событие Load Form_B. В рамках этого события я делаю некоторую инициализацию.

Form_B может отображаться пользователем несколько раз, и я вызываю ShowDialog для моей переменной экземпляра.

Проблема в том, что Load вызывается каждый раз, когда я показываю форму. Я попытался отладки, а также попытался с Show () вместо ShowDialog (). Show () завершается сбоем, когда я закрываю окно, но ShowDialog () не сбоит, но вызывает Load каждый раз, когда оно отображается.

Неправильно ли продолжать использование экземпляра после закрытия формы?

Спасибо, Stefan

Ответы [ 4 ]

10 голосов
/ 15 марта 2011

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

Это, однако, не так. NET, вы инициализируете объект класса с помощью конструктора. только раз, когда вам нужно переопределить OnLoad () (другой способ .NET, события для кода в других классах), когда вы заботитесь о размере и положении формы. Это не будет размер и расположение дизайна, когда пользователь изменил тему Windows или запустит видеоадаптер с более высоким значением DPI. Поэтому вы можете использовать OnLoad для перемещения окна или перестановки элементов управления. На самом деле это не очень распространенная вещь.

Итак, исправьте вашу проблему first , используя вместо этого конструктор. Если вам все еще нужен OnLoad, просто используйте флаг bool, который отслеживает, запущен ли он или нет.

    private bool initialized = false;

    protected override void OnLoad(EventArgs e) {
        if (!initialized) {
            initialized = true;
            // etc...
        }
        base.OnLoad(e);
    }

И да, это работает, только если вы используете ShowDialog (). Форма, отображаемая с помощью Show (), автоматически удаляется, когда она закрыта. Этого не происходит с ShowDialog (), чтобы избежать проблем с получением результатов диалога. Воссоздание экземпляра диалога - лучший способ, если только вы действительно не позаботитесь о сохранении последних введенных значений. Это, однако, очень дорогой способ сделать так, чтобы объекты форм занимали много ресурсов .NET и Windows.

3 голосов
/ 15 марта 2011

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

2 голосов
/ 15 марта 2011

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

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

0 голосов
/ 17 апреля 2018

У меня такая же проблема. После некоторого поиска, я думаю, что "ShowDialog" является исключением.

Поскольку сейчас 2018 год, MS открыла .Net. Я проверил источник и нашел это.

this.CalledOnLoad = false;
this.CalledMakeVisible = false;

в функции ShowDialog ().

https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Form.cs,ab288b84e00f8282

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...