запуск второй формы c

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

запуск второй формы c

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

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

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

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

Источник

Запуск второй формы c

БлогNot. Visual C++: из формы в форму

Visual C++: из формы в форму

Пример конструирования и программного вызова формы

Этот код можно выполнить, например, по нажатию кнопки в главной форме Form1.

Для добавления обработчика нажатия программно сгенерированной кнопки button2 достаточно перед последней строкой кода написать:

— до того, как будет вызван метод form2->ShowDialog() или form2->Show();

При этом код обработчика размещён в текущем модуле Form1.h :

Вызвать другую форму из главной формы

перед первым namespace в Form1.h (то есть, в самое начало файла).

Включим указатель на экземпляр класса в секцию public класса Form1 :

Добавим код там, где нужно создать и вызвать вторую форму:

Для программного удаления второй формы подойдёт код

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

Потом инициализируем данные по событию Load главной формы:

Затем реализуем код для создания очередной формы

Если мы хотим создавать дочерние формы не отдельно, а внутри родительской формы, то в свойствах Form1 нужно указать, что она «предок» (установить свойство IsMdiParent = true ), а перед показом дочерней формы оператором F2[FormCount-1]->Show() пометить её как потомка Form1:

Вызвать из дочерней формы метод родительской формы

Распишем процесс по шагам.

3) Объявить открытый метод Set в Form1.h для того, чтобы можно было изменить текст label1 (код можно написать в конце файла, после #pragma endregion ):

4) В файле Form2.h подключаем Form1.h (в начале):

и создаем конструктор, который будет принимать и сохранять ссылку на первую форму для дальнейшего использования: //ниже сразу ниже можно прописать ссылку: private: Form1^ parentForm;

5) По клику кнопки в Form2 будем вызывать метод Set родительской формы:

Код в файле Form1.cpp :

В Form1.h вставляем только строку:

На этом все. Можно скомпилировать и проверить проект, архив во вложении:

Наладить взаимодействие двух форм

На самом деле, просто развитие идеи. Здесь первая форма умеет передавать данные в текстовое поле второй и наоборот. Теперь они друг друга не «прячут», так что можно создать и много экземпляров второй формы.

Простой пример «многооконного редактора» есть в этой заметке блога.

Источник

Подскажите пожалуйста как сделать чтобы первым запустилась Form2 а не Form1 в Visual Studio 2010.

datagridview. в ячейке выбор нужной формы
datagridview. в ячейке выбор нужной формы, с выбором нужной записи. я так понимаю есть тип колонок.

запуск второй формы cЗапуск формы с правами администратора из другой формы
Есть главная форма с нее открываются форма2 и форма3, например по клику на кнопку2 и кнопку3.

Запуск из cmd нужной версии
Установлено 2 питона: 2.6 и 3.6. Если в cmd вбиваю python, то показывается версия 2.6, а мне нужно.

запуск второй формы cЗапуск cmd в нужной папке
Привет. Надоело все время писать cd чтобы перейти в нужный каталог. Как можно запустить cmd из.

Запуск exe с нужной датой
Добрый вечер, помогите кодом, нужно запустить файл exe программы с определенной датой, например.

Запуск терминала с нужной командой через QT
Есть програмка которая должна запускать профилирование и поиск ошибок в динамической памяти другой.

запуск второй формы cОткрытие формы на нужной записи из другой формы, источником записи которой является запрос-объединение
В MS ACCESS есть ленточная форма Ф3, источником записей которой является запрос-объединение из двух.

Источник

Нужно поменять загрузку формы первую на вторую

запуск второй формы cПоменять в числе первую и вторую цифры
3) Дано трёхзначное целое число А. Поменять в этом числе первую и вторую цифры.

Поменять первую и вторую буквы слова местами
Как переместить в слове 1 букву и 2 букву местами

запуск второй формы cПоменять местами первую и вторую половины массива
Поменять местами первую и вторую половины массива.

Да но теперь не открывается первая форма.
Вторая форма содержит ввод пароля и по нажатию кнопки срабатывает не сложный код.

Поменять местами первую и вторую половину массива.
Помогите решить задачки. 1) Дан массив размера n. Поменять местами первую и вторую половину.

Поменять местами первую и вторую половины массива
Дан массив размера N (N — четное число). Поменять местами первую и вторую половины массива.

запуск второй формы cПоменять местами первую и вторую строки матрицы
Ввести матрицу размером 5 строк и 3 столбца. Поменять местами первую и вторую строки. Полученную.

Поменять местами первую и вторую половины массива
Задание: Задан массив. Задан номер барьерного элемента L, разделяющий массив на две части.

Источник

Закрыть Form1, открыть Form2

Да-да-да, понимаю, тема «заезжая», но сколько я не рыл, ни где толком не объясняется почему все скрывают/показывают форму так:

Таким способом, активная форма не закрывается, а скрывается, правильно?

запуск второй формы c

запуск второй формы c

2 ответа 2

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

Если первая форма в дальнейшем не используется, то можно использовать 2 варианта:

1. Правим Program.cs

По умолчанию содержимое файла Program.cs выглядит так:

Как вы можете заметить, Form1 запускается как приложение и, при завершении работы формы, произойдет выход из Main и приложения.

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

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

2. Переходим от форм к контролам

В WinForms есть замечательный класс UserControl. Это фактически пустой контрол, который вы можете наполнить любым содержимым как и форму.

Ещё можно не передавать форму в Application.Run и запустить его без параметров. Тогда даже закрытие всех форм не приведёт к закрытию приложения. Чтобы выйти окончательно необходимо будет вызвать Application.Exit – Lunar Whisper

Тоже хороший вариант, если необходимо использовать разные формы в процессе работы.

Источник

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

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