Walby Ответов: 6

Откройте новую форму и закройте текущую, не скрывая и не закрывая приложение


Всем привет,

Недавно я наткнулся на то, о чем раньше никогда особо не задумывался, открывая новую форму и закрывая текущую, я обычно просто скрываю текущую и показываю новую форму с помощью метода ShowDialog:

Form2 nextForm = new Form2();<br />
this.Hide();<br />
nextForm.ShowDialog();<br />
this.Close();



Однако на днях я использовал ShowDialog, чтобы действительно получить DialogResult, и подумал, почему бы мне просто не использовать обычный метод show при открытии и закрытии форм, но если я запускаю тот же код, заменяя ShowDialog на Show, приложение закрывается, как только открывается form2.

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

Что касается проблемы с использованием стандартного метода Show, то я понимаю, что причина, по которой он закрывает приложение, связана с событием close Form1, если оно будет запущено, то все приложение закроется, я видел, как некоторые люди создают новый процесс для следующей формы, но я не понимаю его на 100%.

Если бы кто-нибудь мог объяснить это, я был бы благодарен, или если бы кто-нибудь мог предложить альтернативное решение, которое было бы здорово.

С Уважением Старший Криспи.

6 Ответов

Рейтинг:
45

DaveyM69

Вы можете создать свой собственный класс, производный от ApplicationContext Там вы можете иметь столько форм, сколько вам нравится, добавлять и удалять формы и т. д. Когда формы закрываются, уменьшите количество форм - когда 0, вызовите ExitThread();. In program.cs, instaead вызова Application.Run(new YourForm()); передайте instnace вашего пользовательского контекста.


Рейтинг:
2

#realJSOP

Если вы хотите закрыть первую форму, попробуйте сделать это:

Application.Run(new MyNextForm());


Рейтинг:
2

handt

SeniorCrispy писал:
Если бы кто-нибудь мог объяснить это, я был бы благодарен


я думаю, что эта проблема была объяснена правильно.
затем

SeniorCrispy писал:
если бы кто-нибудь мог предложить альтернативное решение, это было бы здорово.


Ответ3 сказал: :
Application.Run(new MyNextForm());


я поддерживаю его, когда он задает такую ситуацию : вы нажимаете кнопку на форме 1, затем всплывающее окно формы 2 и форма 1 исчезает. from1 может dispear простым способом -- form1.hide().но если нам нужно закрыть form1 и более поздняя операция все происходит на form2,как решить эту проблему? если мы используем form1.close(),то это приложение выйдет из памяти, но form2 тоже исчезнет......

теперь проблема в том, чтобы на самом деле закрыть form1(dispear form memory) и открыть новую форму - form2 ? демонстрационный код более ценится :-)

п. мой английский оставляет желать лучшего , я надеюсь, вы можете понять это :-о


Рейтинг:
0

radix3

SeniorCrispy писал:
Form2 nextForm = новая форма 2();
этот.Скрыть();
nextForm.Метод showdialog();
этот.Закрывать();


код должен быть написан так хотя это не имеет никакого значения но я всегда пишу код для скрытия формы таким образом в любом случае
Form2 obj = new Form2();
            obj.Show();
            this.Hide();


Показать диалоговое окно установить Form2 как модальное диалоговое окно

Для получения дополнительной информации вы можете обратиться на этот сайт
Метод showdialog()

этот.Close() при вызове этого метода любой управляемый ресурс может быть легко закрыт, но при вызове метода dispose() он навсегда удалит форму из памяти

Оцените мой ответ, как только вы найдете его полезным

Спасибо и с уважением
Корень :)


Рейтинг:
0

William Winner

Похоже, вы не понимаете, в чем реальная разница между методами Show и ShowDialog или как на самом деле работает программа.

Когда ваша программа на C# запускается, первое, что делает приложение, - это создает новую форму той формы, которая является вашей основной формой, а затем запускает ее. Приложение завершит работу, когда эта форма будет закрыта. Из MSDN: "этот метод добавляет обработчик событий к параметру mainForm для закрытого события. Обработчик событий вызывает ExitThread для очистки приложения."

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

Что касается разницы между Show и ShowDialog, ShowDialog делает то же самое основное. Когда эта строка кода выполняется, он будет ждать, пока эта форма не закроется, чтобы запустить следующую строку кода. Так и с вашим кодом,

Form2 nextForm = new Form2();
this.Hide();
nextForm.ShowDialog();
this.Close(); 

this.Close(); не будет поражен до тех пор, пока nextForm закрывающийся.


SeniorCrispy писал:
все предыдущие формы будут по-прежнему находиться в памяти и оказывать некоторое влияние на производительность.


Это правда. Если вы не закроете форму, она все равно останется в памяти. Однако вы должны держать свою основную форму открытой, иначе приложение закроется. Но, честно говоря, держать основную форму открытой-это действительно довольно незначительное использование памяти.


Walby

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

Рейтинг:
0

Member 10257016

private void OnButton1Click(object sender, EventArgs e)
{
    this.Hide();
    var form2 = new Form2();
    form2.Closed += (s, args) => this.Close(); 
    form2.Show();
}