#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 formsFormClosing
(а это просто ненужная дополнительная работа).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, и вы сможете делать все, что захотите, с другими формами, не относящимися к запуску.