Как закрыть одну форму и открыть другую в c
Перейти к содержимому

Как закрыть одну форму и открыть другую в c

  • автор:

Как закрыть форму из другой

у меня в проекте 3 формы. Из первой формы открываю вторую а затем из второй третью(не закрывая формы), и после выполнения каких то операции на форме 3 пытаюсь закрыть третью и вторую форму. Как это сделать подскажите пожалуйста. я все форумы в инете посмотрел, но ни один из методов не помог(((

Отслеживать
задан 3 мар 2020 в 13:49
Maruf Islamov Maruf Islamov
33 6 6 бронзовых знаков

А вы сами что пробовали то? Напишите хотя бы как пытались закрыть. Вообще форма — это класс, классы C# являются ссылочными типами, так что мешает передать ссылку в нужную форму на нужную форму и там ее закрыть?

3 мар 2020 в 14:10

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Это просто. Допустим, классы второй и третьей форм — Form2 и Form3 . В классе Form3 создаем отрытое поле для хранения ссылки на форму, которая ее открыла. Например, Creator . В Form2 открываем третью форму так:

 private void buttonOpen3dForm_Click(object sender, EventArgs e)

В классе Form3 сначала закрываем 2-ю форму, а потом третью.

public partial class Form3 : Form < public Form Creator; public Form3() < InitializeComponent(); . >. private void buttonClose2ndAnd3dForms_Click(object sender, EventArgs e) < Creator.Close(); this.Close(); >. > 

C# Как грамотно закрыть Form?

Здравствуйте, коллеги! Не думал, что будут проблемы с такими вот вещами, но тем не менее. Вот в чем суть проблемы. Разрабатываю программу, в которой из главной Form1, при нажатии на копку я открываю Form2.

 private void button5_Click(object sender, EventArgs e)

Далее уже на Form2 я выполняю код, который заполняет таблицу на Form1, при этом я вывожу данные в таблицу, а затем мне нужно закрыть Form2 сразу.

 Form1 f = new Form1(); ////// Та та та здесь код запонения таблицы на Form1 f.ShowDialog(); Application.Exit(); 

Так вот в чем проблема: Form2 она то вроде закрывается, но по факту только скрывается. По долгу своей работы, мое приложение должно работать сутками в фоне и получается, что очередной раз пользователь открывает Form2, нажимает там на кнопку, таблица на Form1 заполняется, но Form2 не закрывается, а сворачивается. И так у меня плодятся окна Form1 и Form2 до бесконечности. Как можно это грамотно обыграть? P.s. Пробовал и Form2.ActiveForm.Close() и this.Close() ничего не помогает. Может логическая ошибка где? Помогите, пожалуйста!

Отслеживать
задан 9 фев 2018 в 22:37
97 1 1 золотой знак 1 1 серебряный знак 6 6 бронзовых знаков

подозреваю, вам нужно пересмотреть подход к решению проблемы. попробуйте один раз создавать формы, а потом скрывать/отображать. подробнее: victorz.ru/20160519140

9 фев 2018 в 22:52

Т.е. вы хотите сказать, что код в обработчике события нажатия кнопки в Form2 вида this.Close() не работает? И форма просто меняет свойство Visible на false ? Полагаю, что вы смастерили семиколёсный велосипед в передаче данных между формами, отчего и страдаете. Получить доступ к форме, не важно к какой, можно так: Form1 form1 = (Form1)Application.OpenForms[«Form1»]; , а дальше через делегаты обращайтесь к её методам и переменным как хотите. А через оператор new вы создаёте новый экземпляр объекта. Да и Application.Exit(); — это вообще из другой оперы.

9 фев 2018 в 23:26

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

После закрытия формы через Close() вызовите в первой форме у второй Dispose() и будет вам счастье. Иногда достаточно почитать официальные мануалы.

Два условия, когда форма не удаляется при вызове Close это когда (1) это часть приложения многодокументного интерфейса (MDI) и форма не является видимой; и (2) форма была отображена посредством ShowDialog.

Отслеживать
ответ дан 9 фев 2018 в 23:00
1,109 6 6 серебряных знаков 8 8 бронзовых знаков

Пример обработчика события по нажатию кнопки в Form2 с изменением свойств объектов формы Form1.

private void buttonChangeDataForm1_Click(object sender, EventArgs e) < Form1 form1 = (Form1) Application.OpenForms["Form1"]; // Где Form1 это имя формы содежащаяся в переменной Name. if (form1 != null) // Если форма существует, то изменяем свойства её объектов < form1.textBox.Text = "Bla Bla BLa"; . this.Close(); // Закрываем текущую форму >else MessageBox.Show("Error while changing data in Form1.", "Error"); // Выводим сообщение об ошибке изменения данных > 

Пример более правильного вызова/создания дочерней формы.

private void buttonCreateForm2_Click(object sender, EventArgs e) < Form2 form2 = (Form2) Application.OpenForms["Form2"]; // Где Form2 это имя формы содежащаяся в переменной Name. if (form2 == null) // Если форма не существует, то создаём < Form2 form2 = new Form2(); // Создание нового экземпляра формы form2.Show(); // Отображаем форму >else form2.Activate(); // Активируем форму на передний план (из трея или заднего плана) > 

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

Имена форм для Application.OpenForms[«AnyFormName»]; находятся в свойствах самих форм в переменной Name . Изменить (переопределять не стоит) можно в классе *.Designer.cs .

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

P.S. Если предполагается использование дочернего окна ввод данных в которое обязателен для продолжения работы программы, то никогда не позволяйте это окно убирать в трей. Оно будет всегда поверх основного и его можно либо обработать вводом данных, либо закрыть. Так вы обезопасите себя от потери контроля над формами. И в этом случае вам нет необходимости контролировать наличие окна при его создании, т.к. доступ к основной форме будет ограничен. Достаточно будет выполнить код:

Form form2 = new form2(); form2.ShowDialog(); 

Как закрыть и открыть другую форму в C#?

Статья на BigDevOps

В программировании на C# (C Sharp) часто требуется открытие и закрытие других оконных форм в процессе работы приложения. Открытие и закрытие других форм является важной частью создания многооконных приложений или любых приложений, которые используют диалоговые окна для взаимодействия с пользователем.

Открытие другой формы

Открытие другой формы в C# можно осуществить следующим образом:

    Создайте экземпляр (объект) новой формы, которую вы хотите открыть. Например, для создания новой формы с именем Form2 используйте следующий код:

Form2 form2 = new Form2(); 
form2.Show(); // для открытия немодальной формы form2.ShowDialog(); // для открытия модальной формы 
if (form2.DialogResult == DialogResult.OK) < // выполните действия после закрытия модальной формы >

Закрытие другой формы

Закрытие другой формы в C# можно осуществить различными способами:

    Используйте метод Close() для закрытия формы. Например:

form2.Close(); 
this.Close(); // закроет текущую форму и все модальные формы, открытые из нее 
form2.DialogResult = DialogResult.OK; form2.Close(); // закрытие модальной формы с возвращением результата 

Вывод

Открытие и закрытие других форм в C# — важный аспект разработки оконных приложений. Вы можете использовать методы Show() и ShowDialog() для открытия других форм, а метод Close() для их закрытия. Знание этих методов поможет вам создать более интерактивные и эффективные приложения на C#.

Как открыть и закрыть форму из другой формы в C# (правильное решение)

Как открыть и закрыть форму из другой формы в C# (правильное решение)

C# изучаю не так давно и встала передо мной недавно задача:
— открыть Form2 при нажатии на кнопку в Form1;
— спрятать Form1;
— открыть Form1 при закрытии Form2.
На первый взгляд задача показалась элементарной, но… возникли нюансы — при закрытии приложения оно не выгружалось и в диспетчере задач мы наблюдали его работу, хотя визуально оно как бы закрылось.

В чём же причина такого поведения? Об этом расскажу дальше. Рассмотрим открытие и закрытие форм на примерах.

Открываем и закрываем форму из другой формы

У нас в приложении есть две формы Form1 — главная, которая открывается сразу при запуске приложения и Form2, которую открываем по нажатию на кнопку.

Чтобы открыть Form2 нам необходим следующий код, который будет срабатывать при нажатии на кнопку:

private void button1_Click(object sender, EventArgs e) < Form ifrm = new Form2(); ifrm.Show(); // отображаем Form2 this.Hide(); // скрываем Form1 (this - текущая форма) >

Теперь у нас открылась Form2 и спряталась Form1. Поработав с Form2 мы её закрываем и при этом нам надо после этого отобразить Form1. Многие начинающие, включая меня начинают писать следующий код, который помещаем в событие, которое происходит после закрытия Form2:

private void Form2_FormClosed(object sender, FormClosedEventArgs e) < Form ifrm = new Form1(); ifrm.Show(); // отображаем Form1 this.Close(); // закрываем Form2 (this - текущая форма) // не используйте данный способ, правильный ниже >

Вроде всё логично: Form2 закрылась, Form1 открылась. Однако используя этот метод, мы можем заметить, что после того как мы закрываем приложение оно продолжает висеть в памяти. Многие, не зная почему это происходит дописывают в метод «Form1_FormClosed» дописывают принудительное закрытие приложения:

Application.Exit();

Это работает, однако правильно ли это? Решать вам.

А теперь ответим на вопрос «почему приложение висит в памяти» и рассмотрим простое и правильное решение.

Первая часть кода: мы отображаем Form2 и скрываем Form1. Не закрываем, а именно скрываем, т.е. экземпляр Form1 продолжает существовать.

Закрыть Form1 вместо скрытия не получится, так как это главная форма приложения и при её закрытии мы закроем всё приложение.

Вторая часть кода: строкой «Form ifrm = new Form1();» мы создаём второй экземпляр Form1 и далее его и отображаем, а первый экземпляр Form1 продолжает жить в памяти. И когда мы закрываем приложение (Form1), то первый экземпляр при этом не закрываем он так и «сидит» в памяти, поэтому приложение не выгружается из памяти. В связи с этим многие и закрывают принудительно приложение при закрытии главной формы (Form1).

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

private void Form2_FormClosed(object sender, FormClosedEventArgs e) < // вызываем главную форму приложения, которая открыла текущую форму Form2, главная форма всегда = 0 Form ifrm = Application.OpenForms[0]; ifrm.Show(); >

OpenForms — получает коллекцию открытых форм приложения. В нашем случае мы сразу обратились к главной форме приложения (OpenForms[0]).

Теперь при закрытии Form2 у нас будет вызываться и отображаться та форма, которая породила закрывающуюся.

Учитываем координаты форм при открытии

Представьте ситуацию. Открыта Form1 вы её перемещаете в правый верхний угол экрана. Потом нажимаете на кнопку и… Form2 открывается по центру экрана или в другом месте, но не в том месте, где была Form1. Многие улыбнуться и скажут, что в свойствах Form2 надо прописать/указать следующее «StartPosition -> CenterParent» и открывать Form2 следующим методом:

Form ifrm = new Form2(); ifrm.ShowDialog();

Это правильное решение, которое всегда будет открывать Form2 поверх Form1 и всегда по центру Form1. Однако этот код не применим, если вам надо скрывать Form1, так как Form1 не будет скрываться.

Сейчас приведу полное решение, которое позволит открывать Form1 и Form2 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):

— свойство Form1: «StartPosition -> CenterScreen»
— свойство Form2: «StartPosition -> Manual»

Открыть и закрыть форму из другой формы в C# (правильное решение)

private void button1_Click(object sender, EventArgs e) < Form ifrm = new Form2(); ifrm.Left = this.Left; // задаём открываемой форме позицию слева равную позиции текущей формы ifrm.Top = this.Top; // задаём открываемой форме позицию сверху равную позиции текущей формы ifrm.Show(); // отображаем Form2 this.Hide(); // скрываем Form1 (this - текущая форма) >
private void Form2_FormClosed(object sender, FormClosedEventArgs e) < // вызываем главную форму, которая открыла текущую, главная форма всегда = 0 - [0] Form ifrm = Application.OpenForms[0]; ifrm.StartPosition = FormStartPosition.Manual; // меняем параметр StartPosition у Form1, иначе она будет использовать тот, который у неё прописан в настройках и всегда будет открываться по центру экрана ifrm.Left = this.Left; // задаём открываемой форме позицию слева равную позиции текущей формы ifrm.Top = this.Top; // задаём открываемой форме позицию сверху равную позиции текущей формы ifrm.Show(); // отображаем Form1 >

Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.

Открываем форму поверх другой формы, как модальное окно

Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:

private void button1_Click(object sender, EventArgs e)

В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.

Как увеличить яркость в игре Doom 4 (2016)

Предыдущая запись

Как создать генератор паролей на C#

Следующая запись

Отличная статья, как раз решило мою идентичную проблему, автору удачи в дальнейшем и спасибо за помощь.

вроде стать о том как с одной формы закрыть другу?! причем тут скрытие/закрытие первой открытия второй и на оборот.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *