как открыть новую форму в 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 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):
Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.
Открываем форму поверх другой формы, как модальное окно
Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:
В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.
BestProg
Пример создания и вызова новой формы приложения в C#
Содержание
Поиск на других ресурсах:
Условие задания
Разработать демонстрационное приложение, осуществляющее вызов из главной формы второстепенной формы по схеме, изображенной на рис. 1. Приложение реализует взаимодействие между различными формами, которыми могут быть диалоговые окна любой сложности.
В главной форме Form1 разместить:
Во второстепенной форме Form2 разместить:
Рис. 1. Схема взаимодействия между формами
⇑
Выполнение
1. Создать приложение типа Windows Forms Application
Сохранить проект в произвольной папке.
После создания приложения у нас есть одна форма. Программный код формы размещен в файле « Form1.cs » (рис. 2).
Рис. 2. Главная форма приложения Form1
⇑
2. Разработка главной формы приложения
Из палитры элементов управления Toolbox выносим на форму:
Рис. 3. Главная форма приложения после внесенных изменений
⇑
3. Создание второстепенной формы
Для создания второстепенной формы в C# можно воспользоваться несколькими способами.
Способ 1.
Для добавления формы №2 в проект этим способом нужно вызвать команду (рис. 4)
Рис. 4. Команда « Add Windows Form… » для добавления новой формы в проект
В результате откроется окно « Add New Item — Windows Forms Application1 «. В этом окне выбираем элемент « Windows Form » (рис. 5). Оставляем имя формы как « Form2.cs «.
Рис. 5. Окно добавления новой формы к проекту
После нажатия на кнопке « Add » новая форма будет добавлена к проекту (рис. 6).
Рис. 6. Новосозданная форма Form2 и файл « Form2.cs «
Способ 2.
Также новую форму можно добавить к проекту с помощью соответствующей команды из контекстного меню (рис. 7).
Последовательность действий следующая:
Рис. 7. Добавление новой формы из Solution Explorer
В результате откроется точно такое же окно как на рисунке 5.
⇑
4. Разработка второстепенной формы
Рис. 8. Второстепенная форма Form2
⇑
5. Программирование событий клика на кнопках OK и Cancel формы Form2
В программный код обработчика события button1_Click() (кнопка « OK «) вписываем следующую строку:
это значит, что результат возврата из формы Form2 есть « OK «.
Точно так же в обработчике события button2_Click вписываем:
это значит выбор кнопки « Cancel » ( button2 ).
После внесенных изменений листинг программного кода файла « Form2.c s» будет иметь следующий вид:
Рис. 9. Команда « View Code » для перехода в режим программного кода
⇑
6. Вызов формы Form2 из главной формы приложения
Согласно с условием задачи, для вызова Form2 из Form1 нужно запрограммировать событие клика на кнопке « Show Form 2 «.
Программный код обработчика события будет иметь следующий вид:
Листинг всего программного кода формы Form1 следующий
⇑
7. Выполнение приложения
После выполненных действий можно выполнять приложение и исследовать его работу.
Как открыть новую форму в 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 вставляем только строку:
На этом все. Можно скомпилировать и проверить проект, архив во вложении:
Наладить взаимодействие двух форм
На самом деле, просто развитие идеи. Здесь первая форма умеет передавать данные в текстовое поле второй и наоборот. Теперь они друг друга не «прячут», так что можно создать и много экземпляров второй формы.
Простой пример «многооконного редактора» есть в этой заметке блога.
Элементы управления
Элементы управления представляют собой визуальные классы, которые получают введенные пользователем данные и могут инициировать различные события. Все элементы управления наследуются от класса Control и поэтому имеют ряд общих свойств:
Anchor : Определяет, как элемент будет растягиваться
BackColor : Определяет фоновый цвет элемента
BackgroundImage : Определяет фоновое изображение элемента
ContextMenu : Контекстное меню, которое открывается при нажатии на элемент правой кнопкой мыши. Задается с помощью элемента ContextMenu
Cursor : Представляет, как будет отображаться курсор мыши при наведении на элемент
Dock : Задает расположение элемента на форме
Enabled : Определяет, будет ли доступен элемент для использования. Если это свойство имеет значение False, то элемент блокируется.
Font : Устанавливает шрифт текста для элемента
ForeColor : Определяет цвет шрифта
Location : Определяет координаты верхнего левого угла элемента управления
Name : Имя элемента управления
Size : Определяет размер элемента
Width : ширина элемента
Height : высота элемента
TabIndex : Определяет порядок обхода элемента по нажатию на клавишу Tab
Tag : Позволяет сохранять значение, ассоциированное с этим элементом управления
Кнопка
Наиболее часто используемым элементом управления является кнопка. Обрабатывая событие нажатия кнопки, мы может производить те или иные действия.
Оформление кнопки
Чтобы управлять внешним отображением кнопки, можно использовать свойство FlatStyle. Оно может принимать следующие значения:
Изображение на кнопке
Overlay : текст накладывается на изображение
ImageAboveText : изображение располагается над текстом
TextAboveImage : текст располагается над изображением
ImageBeforeText : изображение располагается перед текстом
TextBeforeImage : текст располагается перед изображением
Например, установим для кнопки изображение. Для этого выберем кнопку и в окне Свойств нажмем на поле Image (не путать с BackgroundImage). Нам откроется диалоговое окно установи изображения:
Клавиши быстрого доступа
Кнопки по умолчанию
Форма, на которой размещаются все элементы управления, имеет свойства, позволяющие назначать кнопку по умолчанию и кнопку отмены.
Так, свойство формы AcceptButton позволяет назначать кнопку по умолчанию, которая будет срабатывать по нажатию на клавишу Enter.
Как переключаться между формами, не создавая новый экземпляр форм?
В моем приложении у меня есть четыре формы form1 form2 form3 form4. и каждая форма имеет две кнопки, то есть следующие и предыдущие кнопки для переключения между формами. и мой вопрос: как я могу переключаться между формами, не создавая новый экземпляр форм? ниже мой код
8 ответов
Поскольку вы обращаетесь к своим формам последовательно, просто убедитесь, что вы используете метод Show, который назначает владельца созданной форме и назначает его переменной уровня класса после ее создания. Что-то вроде этого должно сработать для вас.
Просто удалите this.hide() в первой форме и [formNameHere].show(); во второй форме.
И т. д. не очень хорошо объяснять, и на самом деле с C #. Но это должно сработать.
Я была такая же проблема. Мне нужно было приложение с множеством форм, и мне нужно было переключаться между формами вперед и назад без потери данных. Я придумал следующее решение, и оно сработало для меня.
В основном файле (Program.cs) напишите следующие два класса:
Первый класс используется для глобальных переменных, которые можно использовать в формах. Вы можете получить доступ к любой переменной:
Это работает гладко и идеально подходит для меня. Попытайся.
Похоже, вы пытаетесь реализовать функцию мастера. Я бы рекомендовал иметь единую форму. Затем добавьте к нему настраиваемый элемент управления вкладками. Добавьте кнопки в форму, которая перемещается вперед и назад.
Чтобы настроить управление вкладками, вам нужно сделать следующее:
Этот элемент управления вкладками будет отображать только одну вкладку за раз. Хотя, во время разработки вы их все можете увидеть. Добавьте это и кнопки в свою форму. При нажатии кнопки просто установите свойство SelectedIndex этого элемента управления вкладкой.
Эта функция может использоваться, чтобы узнать, открыта ли форма уже или нет.
И в вашем случае
В every forms constructor() создать следующий и предыдущий объект формы
И при нажатии кнопки вызывается IsFormAlreadyOpen (), чтобы узнать, открыта ли форма уже или нет, и если она уже открыта, просто выведите эту форму на передний план, иначе отобразите форму с помощью метода obj.show () и скрыть или закрыть родительскую форму