Закрыть Form1, открыть Form2
Да-да-да, понимаю, тема «заезжая», но сколько я не рыл, ни где толком не объясняется почему все скрывают/показывают форму так:
Form2 frm = new Form2(); this.Hide(); frm.Show();
Таким способом, активная форма не закрывается, а скрывается, правильно? Как правильно закрыть Form1 и открыть Form2 ?
Отслеживать
22.3k 10 10 золотых знаков 56 56 серебряных знаков 118 118 бронзовых знаков
задан 5 окт 2016 в 13:47
509 3 3 золотых знака 8 8 серебряных знаков 20 20 бронзовых знаков
а зачем вам полностью закрывать форму? опишите задачу подробнее. По умолчанию, первая форма в проекте запускается как приложение и при закрытии формы — закрывается приложение.
5 окт 2016 в 13:51
@rdorn, например, ту форму которую хочу закрыть — она мне больше не понадобится, зачем её держать?
5 окт 2016 в 13:53
а вариант использования UserControl в размер формы вместо форм не рассматривали?
5 окт 2016 в 13:54
@rdorn, приведите, пожалуйста, пример, если не затруднит. Вы сами, вообще, как скрываете форму? 🙂
5 окт 2016 в 13:58
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
В проекте WinForms есть два вида форм — главная и дочерние. Разница между ними в том, что главная форма по сути и является приложением, поэтому при ее закрытии происходит выход из приложения.
Одним из решений является скрытие главной формы, вместо закрытия. Этот вариант уже написан в вопросе. Он обычно применяется, когда главная форма так или иначе используется в дальнейшем.
Если первая форма в дальнейшем не используется, то можно использовать 2 варианта:
1. Правим Program.cs
По умолчанию содержимое файла Program.cs выглядит так:
using System; using System.Windows.Forms; namespace WindowsFormsApplication4 < static class Program < /// /// The main entry point for the application. /// [STAThread] static void Main() < Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); >> >
Как вы можете заметить, Form1 запускается как приложение и, при завершении работы формы, произойдет выход из Main и приложения.
Чтобы этого не произошло, можно прописать последовательность запуска форм:
Application.Run(new Form1()); Application.Run(new Form2()); Application.Run(new Form3());
Тогда при закрытии первой формы, будет вызвана вторая и так до последней.
Недостаток — сложно передавать данные между формами. Да можно определить поля в классе Program , конструкторы с параметрами в формах и передавать данные через эти поля и параметры конструкторов, но что делать если нужно вернуться в одну из предыдущих форм? Пилить сложную логику переходов в Main — не сама лучшая идея, мягко говоря.
2. Переходим от форм к контролам
В WinForms есть замечательный класс UserControl. Это фактически пустой контрол, который вы можете наполнить любым содержимым как и форму.
После того, как набор таких контролов подготовлен, вам остается только разместить их на форме с параметром Dock = DockStyle.Fill и управляя значением свойства Conrol.Visible , показывать тот контрол, который вам нужен в данный момент. Если не хотите держать контрол в памяти, ни кто не мешает просто создавать его в нужный момент и отображать, а после использования и переключения на новый контрол, отписаться от событий, вызвать Dispose() , удалить все ссылки и отдать его на растерзание сборщику мусора. Только выигрыш от этого невелик, особенно если вдруг надумаете снова его показать.
Забыл написать про еще один недостаток переключения между формами через Main . Каждая новая форма будет открываться немного в другом месте, может для защиты от программ-автокликеров это и хорошо, но меня, как пользователя, такое поведение раздражает, и думаю что не только меня.
Ещё можно не передавать форму в Application.Run и запустить его без параметров. Тогда даже закрытие всех форм не приведёт к закрытию приложения. Чтобы выйти окончательно необходимо будет вызвать Application.Exit – Lunar Whisper
Тоже хороший вариант, если необходимо использовать разные формы в процессе работы.
Как закрыть первую форму и открыть вторую
Таким образом, если закрыть нажатием крестика форму2, то это приложение будет работать дальше, но без открытых окон. И приходится его доставать через диспетчер задач.
1 2 3
Form2 f = new Form2(); f.Show(); this.Close();
Если так, то он закрывает полностью всё.
1 2 3 4
Form1 f1 = new Form1(); Form2 f = new Form2(); f.Show(); f1.Close();
Ничего не происходит.
Хочу, чтобы в форм1 вызывалась форм2, при этом форм1 закрывалась. и при закрытии форм2 нажатием на крестик полностью программа закрывалась.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как открыть вторую форму и закрыть первую?
у меня есть в главной форме кнопка надо, чтобы по нажатию на неё выскакивала еще одна форма ( тоже.
Как одновременно открыть вторую форму и закрыть первую
У меня такая проблема. Я пытаюсь одновременно открыть вторую форму и закрыть первую форму через.
При успешной авторизации первую форму закрыть и открыть вторую
Есть 2 формы. 1 — форма это окно авторизации, 2 сама программы. Нужно чтобы при успешной.
Как открыть вторую форму, спрятав первую?
Здравствуйте! Наткнулся вот на такую проблему. На кнопку на первой форме у меня вот такой код: .
170 / 170 / 56
Регистрация: 10.07.2011
Сообщений: 251
при закрытии форм2 нажатием на крестик полностью программа закрывалась
у форм 2 на событие formclosing наишите Application.Exit()
Регистрация: 10.02.2012
Сообщений: 25
Сообщение от gevorg89
событие formclosing
а что надо сделать, чтобы его получить? или просто прописать? но если просто, то куда?
1244 / 1054 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
щёлкни по форме, и в объектном инспекторе перейди на вкладку Events (события), найди в списке нужное, щёлкни два раза по нему, создастся заготовка в коде, туда и пиши
Регистрация: 10.02.2012
Сообщений: 25
Монфрид, gevorg89, спасибо, помогло.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Закрыть первую форму и перейти на вторую форму
Как сделать, чтоб на 1-й форме, нажав кнопку выход закрылась вся первая форма, а при нажатии на.
Открыть вторую форму и скрыть первую
Скажите почему в форме, которая содержит класс, нельзя сделать вот так: Form2 a=new Form2();.
Как закрыть вторую форму из первой?
Как закрыть вторую форму из первой? создал: Vnesti Vnes = new Vnesti(); .
Как закрыть вторую форму при нажатии на кнопку?
Есть 2 формы. На 1 форме список данных и парочка кнопок, если нажимаю кнопку редактировать то.
Закрыть первую форму и перейти на вторую форму
Как сделать, чтоб на 1-й форме, нажав кнопку выход закрылась вся первая форма, а при нажатии на кнопку переход, был бы переход на вторую форму?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как открыть вторую форму и закрыть первую?
у меня есть в главной форме кнопка надо, чтобы по нажатию на неё выскакивала еще одна форма ( тоже.
Как закрыть первую форму и открыть вторую
Как закрыть первую форму и открыть вторую? Form2 f = new Form2(); f.Show(); .
Как одновременно открыть вторую форму и закрыть первую
У меня такая проблема. Я пытаюсь одновременно открыть вторую форму и закрыть первую форму через.
При успешной авторизации первую форму закрыть и открыть вторую
Есть 2 формы. 1 — форма это окно авторизации, 2 сама программы. Нужно чтобы при успешной.
547 / 478 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
Это делается одной кнопкой
Добавлено через 4 минуты
1 2 3 4 5 6 7 8 9
Forms Code { private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Show(); this.Hide(): } }
Регистрация: 11.03.2017
Сообщений: 52
zna926, а если на второй форме тоже должны быть 2 кнопки «закрыть»(закрывает только 2 форму) и «выход»(выход из всего приложения?
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
Сообщение от ВероникаК
«выход»(выход из всего приложения?
Application.Exit();
Сообщение от ВероникаК
«закрыть»(закрывает только 2 форму)
Обычно делаю через овнера
Вызов 2 формы:
1 2 3 4 5 6 7
private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Owner = this; f2.Show(); this.Hide(): }
На второй форме
this.Owner.Show(); this.Close();
Как сделать две формы открытыми друг друга в C#
Это своего рода упражнение новичка в создании двух форм, работающих друг с другом, хотя оно поднимает некоторые проблемы, не связанные с новичком.
Начинающие часто хотят, чтобы две формы (или более) открывали друг друга. К сожалению, это удивительно запутанно на C#.
Первый шаг заключается в том, чтобы понять, что каждая форма нуждается в некоторой переменной, которая относится к другой, чтобы она могла отобразить другую форму. Есть только несколько мест, которые вы могли бы поместить в эту переменную. Например, вы можете создать третий класс для хранения переменных, а затем дать переменным класса два для хранения ссылок на две формы. Вы даже можете сделать переменные static (shared), поэтому вам не нужно будет создавать экземпляр класса.
Этот подход работает и является удобным способом разрешить другим частям программы (включая две формы) обмениваться данными. В более общем плане это позволяет вам ограничить ограничение C# тем, что все данные и код должны быть в классе. Но некоторые считают, что это решение является неэлегантным.
Подход, который используется в этом примере, состоит в том, чтобы дать каждой из двух форм переменную, относящуюся к другой. Когда начинается основная форма, обработчик события Load инициализирует обе переменные.
Каждая из форм содержит кнопку, отображающую другую форму.
Следующий код показывает код второй формы.
// Переменная, которая ссылается на экземпляр Form2. // Обратите внимание, что это общедоступно. public Form1 TheForm1; // Переключитесь на TheForm1. private void btnForm1_Click(object sender, EventArgs e)
Сначала код создает переменную с именем TheForm1 для хранения экземпляра класса Form1. Поскольку обработчик события первой формы Load инициализирует его, переменная должна быть объявлена public.
Когда вы нажимаете кнопку формы, код скрывает текущую форму. Обратите внимание, что это не уничтожает форму, она просто делает ее невидимой.
Затем код отображает первую форму, которая хранится в переменной TheForm1.
В следующем коде показан код первой формы.
// Переменная, которая ссылается на экземпляр Form2. private Form2 TheForm2; // Инициализация переменных формы. private void Form1_Load(object sender, EventArgs e) < // Создаем форму2. TheForm2 = new Form2(); // Инициализация переменной Form2. TheForm2.TheForm1 = this; // Сделайте обе формы на вершине. this.TopMost = true; TheForm2.TopMost = true; >// Переключитесь на Form2. private void btnForm2_Click(object sender, EventArgs e)
Как и вторая форма, этот код имеет ссылку на другую форму. Поскольку эта форма является единственной, которая должна ссылаться на переменную TheForm2, объявляется private.
Когда форма загружается, обработчик события Load создает новый объект Form2 и сохраняет ссылку на него в переменной TheForm2.
Далее код инициализирует переменную TheForm1 новой формы, чтобы она указывала на текущую форму, имеет тип Form1. Теперь Form2 может вернуться к этому Form1.
Когда форма показывает друг друга, они иногда оказываются ниже других программ на рабочем столе. Чтобы предотвратить отбрасывание форм в обратную сторону, необычная особенность Windows, программа устанавливает оба свойства формы TopMost в true. Это держит их выше всех других не-верхних форм.
Когда пользователь нажимает кнопку первой формы, обработчик события Click скрывает текущую форму и отображает другую форму.
Это основной подход, но есть еще одна важная проблема. По умолчанию начальная форма, которая изначально Form1, играет важную роль в программе C#. Когда эта форма уничтожается, программа заканчивается. В этом примере, если вы нажмете форму запуска, форма запуска скрывает и отображает вторую форму. Теперь, если вы закрываете вторую форму, вторая форма исчезает, но форма запуска все еще скрыта. Это означает, что нет возможности закончить программу. Он сидит там на заднем плане, как зомби, тратящие ресурсы.
Существует несколько подходов. Два самых простых и самых очевидных — закрыть первую форму и предотвратить вторую закрытие. Для обоих подходов вы добавляете обработчик события Form_Closing во вторую форму.
Чтобы закрыть первую форму при закрытии второй формы, просто сделайте обработчик события Form_Closing закрытием второй формы, как в следующем коде.
private void Form2_FormClosing(object sender, FormClosingEventArgs e) < // Подход 1: Закройте форму запуска. TheForm1.Close(); >
Теперь, когда вторая форма закрывается, она также закрывает первую (стартовую) форму, поэтому программа заканчивается.
Для второго подхода make обработчик события Form_Closing установил для параметра e.Cancel значение e.Cancel для предотвращения закрытия второй формы. Затем скройте его и покажите стартовую форму, как и раньше. Следующий код показывает этот подход.
private void Form2_FormClosing(object sender, FormClosingEventArgs e) < // Подход 2: скрыть эту форму, а не закрывать ее. this.Hide(); TheForm1.Show(); e.Cancel = true; >
В любом случае пользователь не может закрыть вторую форму, не закрывая форму запуска, так что вы не получите программу зомби.