О закрытии формы во время выполнения в C#

#c# #winforms #formclosing

#c# #winforms #закрытие формы

Вопрос:

В моем проекте на frmRegistration c # frmMain есть две формы с именами amp;.

Я установил frmRegistration в качестве своей начальной формы.
Пользователь вводит данные в frmRegistration форму и нажимает кнопку отправить, чтобы зарегистрироваться. Затем я хочу закрыть frmRegistration форму и показать frmMain форму пользователю.
Я пытаюсь это сделать, используя Dispose() метод frmRegistration . Но, когда я использую этот метод, он удаляет все выполнение моего приложения, потому что frmRegistration это форма запуска.

Я не хочу, чтобы это произошло. Кто-нибудь может решить эту проблему?

Спасибо.

Комментарии:

1. почему вы не использовали метод form.close()?

Ответ №1:

Используйте методы Show() и Hide() .

     private void btnSubmit_Click(object sender, EventArgs e)
    {
      ...
      var frm = new frmMain();
      frm.Location = this.Location;
      frm.StartPosition = FormStartPosition.Manual;
      frm.Show();
      this.Hide();
    }  
  

Обновить:
Если вы не хотите иметь frmRegistration в памяти, запустите свою программу в основной форме и добавьте это в Shown событие вашей основной формы:

     var frm = new frmRegistration();
    frm.Location = this.Location;
    frm.StartPosition = FormStartPosition.Manual;
    frm.FormClosing  = delegate { this.Show(); };
    frm.Show();
    this.Hide();  
  

Теперь вы можете просто закрыть регистрационную форму и автоматически вернуться к основной форме.

Комментарии:

1. проблема с этим подходом заключается в том, что вы всегда сохраняете frmRegistraion в памяти, и я не думаю, что это необходимо.

2. AtoMerZ: Я согласен, frmRegistration это тот, который должен быть создан внутри основной формы. Это имеет больше смысла. Например, в главной форме может быть пункт меню входа / выхода из системы, который также показывал бы экземпляр frmRegistration . И, как предлагает Камьяр, закрытие основной формы не закроет frmRegistration , она просто останется скрытой, если только не будет прослушивателя события main forms FormClosing (а это просто ненужная дополнительная работа).

3. я попробовал ваш второй код. Я написал приведенный выше код в событии загрузки frmMain () и установил frmMain в качестве моей формы запуска в Program.cs . . Когда я использовал этот код в тот раз, моя форма frmMain отображается, а форма frmRegistration становится скрытой. Но я не получаю то, что хочу. Я хочу сначала выполнить свою форму frmRegistration, и после нажатия на кнопку отправки я хочу закрыть эту форму навсегда, и я хочу открыть свою форму frmMain. знаете ли вы что-нибудь об этом

4. Я использовал ваш код. Он показывает требуемый результат, но frmMain форма отображается в течение 1 секунды, после чего она скрывается, а затем открывается frmRegistration. И если моя frmMain форма имеет максимальный размер, а frmRegistration имеет нормальный размер, то это выглядит не очень хорошо. но спасибо за ответ.

Ответ №2:

Попробуйте установить frmMain в качестве формы запуска и скрыть ее изначально, покажите frmRegistration, сделайте то, что вы должны сделать, и утилизируйте ее.

Ответ №3:

Вы также можете изменить свой Program.cs основной класс с помощью Main() функции на start frmRegistration , и после положительной DialogResult или другой проверки он будет запускаться с frmMain — в качестве вашей основной формы и цикла сообщений.

Комментарии:

1. Это сработало бы, но привело бы к дополнительным осложнениям, если OP решит реализовать функциональность входа / выхода из системы после того, как основная форма уже запущена.

Ответ №4:

По крайней мере, есть два варианта: 1. Превратите вашу стартовую форму в одноэлементную, когда вам нужно ее скрыть, вызовите ее метод hide

2. Создайте новую другую форму запуска, назовите ее MainApp form или как угодно, установите для нее значение invisible, и вы сможете делать все, что захотите, с другими формами, не относящимися к запуску.