Добавление форм. Взаимодействие между формами
Последнее обновление: 31.10.2015
Чтобы добавить еще одну форму в проект, нажмем на имя проекта в окне Solution Explorer (Обозреватель решений) правой кнопкой мыши и выберем
Add(Добавить)->Windows Form…
Дадим новой форме какое-нибудь имя, например, Form2.cs:
Итак, у нас в проект была добавлена вторая форма. Теперь попробуем осуществить взаимодействие между двумя формами. Допустим, первая форма
по нажатию на кнопку будет вызывать вторую форму. Во-первых, добавим на первую форму Form1 кнопку и двойным щелчком по кнопке перейдем в файл кода. Итак,
мы попадем в обработчик события нажатия кнопки, который создается по умолчанию после двойного щелчка по кнопке:
private void button1_Click(object sender, EventArgs e) { }
Теперь добавим в него код вызова второй формы. У нас вторая форма называется Form2, поэтому сначала мы создаем объект данного класса, а потом для его
отображения на экране вызываем метод Show:
private void button1_Click(object sender, EventArgs e) { Form2 newForm = new Form2(); newForm.Show(); }
Теперь сделаем наоборот — чтобы вторая форма воздействовала на первую. Пока вторая форма не знает о существовании первой. Чтобы это исправить, надо
второй форме как-то передать сведения о первой форме. Для этого воспользуемся передачей ссылки на форму в конструкторе.
Итак перейдем ко второй форме и перейдем к ее коду — нажмем правой кнопкой мыши на форму и выберем View Code (Просмотр кода). Пока он пустой и
содержит только конструктор. Поскольку C# поддерживает перегрузку методов, то мы можем создать несколько методов и конструкторов с разными
параметрами и в зависимости от ситуации вызывать один из них. Итак, изменим файл кода второй формы на следующий:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public Form2(Form1 f) { InitializeComponent(); f.BackColor = Color.Yellow; } } }
Фактически мы только добавили здесь новый конструктор public Form2(Form1 f)
, в котором мы получаем первую форму и устанавливаем ее фон
в желтый цвет. Теперь перейдем к коду первой формы, где мы вызывали вторую форму и изменим его на следующий:
private void button1_Click(object sender, EventArgs e) { Form2 newForm = new Form2(this); newForm.Show(); }
Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект — объект Form1, то при создании второй формы она будет получать ее (ссылку)
и через нее управлять первой формой.
Теперь после нажатия на кнопку у нас будет создана вторая форма, которая сразу изменит цвет первой формы.
Мы можем также создавать объекты и текущей формы:
private void button1_Click(object sender, EventArgs e) { Form1 newForm1 = new Form1(); newForm1.Show(); Form2 newForm2 = new Form2(newForm1); newForm2.Show(); }
При работе с несколькими формами надо учитывать, что одна из них является главной — которая запускается первой в файле Program.cs.
Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Содержание
- Условие задания
- Выполнение
- 1. Создать приложение типа Windows Forms Application
- 2. Разработка главной формы приложения
- 3. Создание второстепенной формы
- 4. Разработка второстепенной формы
- 5. Программирование событий клика на кнопках OK и Cancel формы Form2
- 6. Вызов формы Form2 из главной формы приложения
- 7. Выполнение приложения
- Связанные темы
Поиск на других ресурсах:
Условие задания
Разработать демонстрационное приложение, осуществляющее вызов из главной формы второстепенной формы по схеме, изображенной на рис. 1. Приложение реализует взаимодействие между различными формами, которыми могут быть диалоговые окна любой сложности.
В главной форме Form1 разместить:
- элемент управления типа Label для вывода результата возврата из второстепенной формы;
- элемент управления типа Button для вызова второстепенной формы.
Во второстепенной форме Form2 разместить:
- элемент управления типа Label для вывода заголовка формы;
- два элемента управления типа Button для обеспечения подтверждения или неподтверждения выбора (действия) во второстепенной форме.
Рис. 1. Схема взаимодействия между формами
⇑
Выполнение
1. Создать приложение типа Windows Forms Application
Запустить Microsoft Visual Studio 2010. Пример создания нового приложения типа Windows Forms Application подробно описывается здесь.
Сохранить проект в произвольной папке.
После создания приложения у нас есть одна форма. Программный код формы размещен в файле «Form1.cs» (рис. 2).
Рис. 2. Главная форма приложения Form1
⇑
2. Разработка главной формы приложения
Из палитры элементов управления Toolbox выносим на форму:
- элемент управления типа Button;
- элемент управления типа Label.
Автоматически создаются два объекта-переменные с именами button1 и label1.
В элементе управления типа Button свойство Text установить в значение «Show Form 2«.
В элементе управления типа Label свойство Text установить в значение «Result = «.
После внесенных изменений главная форма Form1 приложения будет иметь вид как показано на рисунке 3.
Рис. 3. Главная форма приложения после внесенных изменений
⇑
3. Создание второстепенной формы
Для создания второстепенной формы в C# можно воспользоваться несколькими способами.
Способ 1.
Для добавления формы №2 в проект этим способом нужно вызвать команду (рис. 4)
Project -> Add Windows Form...
Рис. 4. Команда «Add Windows Form…» для добавления новой формы в проект
В результате откроется окно «Add New Item — Windows Forms Application1«. В этом окне выбираем элемент «Windows Form» (рис. 5). Оставляем имя формы как «Form2.cs«.
Рис. 5. Окно добавления новой формы к проекту
После нажатия на кнопке «Add» новая форма будет добавлена к проекту (рис. 6).
Рис. 6. Новосозданная форма Form2 и файл «Form2.cs«
Способ 2.
Также новую форму можно добавить к проекту с помощью соответствующей команды из контекстного меню (рис. 7).
Последовательность действий следующая:
- в Solution Explorer сделать клик правой кнопкой «мышки» на названии приложения WindowsFormsApplication1;
- выбрать подменю Add;
- в подменю Add выбрать команду «Windows Form…«.
Рис. 7. Добавление новой формы из Solution Explorer
В результате откроется точно такое же окно как на рисунке 5.
⇑
4. Разработка второстепенной формы
Следующим шагом есть разработка второстепенной формы. Используя средства панели инструментов Toolbox создаем второстепенную форму Form2 как показано на рисунке 8. Такое построение формы соответствует условию задачи. Таким же образом, на Form2 имеем элементы управления label1, butto1, button2.
Рис. 8. Второстепенная форма Form2
⇑
5. Программирование событий клика на кнопках OK и Cancel формы Form2
Программируем событие клика на кнопке OK. Подробный пример программирования события клика на кнопке OK описывается здесь.
В программный код обработчика события button1_Click() (кнопка «OK«) вписываем следующую строку:
this.DialogResult = DialogResult.OK;
это значит, что результат возврата из формы Form2 есть «OK«.
Точно так же в обработчике события button2_Click вписываем:
this.DialogResult = DialogResult.Cancel;
это значит выбор кнопки «Cancel» (button2).
После внесенных изменений листинг программного кода файла «Form2.cs» будет иметь следующий вид:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void button2_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
}
Переход к программному коду формы Form2 (файл «Form2.cs«) можно осуществить с помощью Solution Explorer. Для этого в Solution Explorer вызываем контекстное меню для формы Form2 и из этого меню выбираем команду «View Code» (рис. 9).
Рис. 9. Команда «View Code» для перехода в режим программного кода
⇑
6. Вызов формы Form2 из главной формы приложения
Согласно с условием задачи, для вызова Form2 из Form1 нужно запрограммировать событие клика на кнопке «Show Form 2«.
Программный код обработчика события будет иметь следующий вид:
...
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2(); // создаем объект типа Form2
if (f.ShowDialog() == DialogResult.OK) // вызов диалогового окна формы Form2
{
label1.Text = "Result = OK!";
}
else
{
label1.Text = "Result = Cancel!";
}
}
...
В листинге, приведенном выше, сначала создается экземпляр класса типа Form2. В операторе условного перехода if осуществляется вызов диалогового окна формы Form2 с помощью строки
f.ShowDialog();
Функция ShowDialog() выводит окно формы и держит его открытым до тех пор, пока пользователь не сделает какой-либо выбор. После выбора пользователем той или иной команды, окно закрывается с кодом возврата. Происходит проверка кода возврата с известными константами класса DialogResult. После проверки выводится сообщение о действии, выбранном пользователем в Form2 (элемент управления label2).
Листинг всего программного кода формы Form1 следующий
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
if (f.ShowDialog() == DialogResult.OK)
{
label1.Text = "Result = OK!";
}
else
{
label1.Text = "Result = Cancel!";
}
}
}
}
⇑
7. Выполнение приложения
После выполненных действий можно выполнять приложение и исследовать его работу.
Связанные темы
- Delphi. Создание новой формы и подключение ее к главной форме программы
- C++ Builder. Пример создания и вызова новой формы из главной формы приложения
- Пример создания и вызова диалогового окна в MS Visual Studio 2010 — C++ (MFC)
⇑
Ответы на 7 самых частых вопроса по WinForms
1. Как создать вторую форму
2. Как передать данные из одной формы в другую
2.1 Изменение модификатора доступа
2.2 Использование открытого свойства/метода
2.3 Передача данных в конструктор Form2
2.4 Передача ссылки в конструктор
2.5 Используем свойство ‘родитель’
2.6 Используем отдельный класс
2.7 Использование функций обратного вызова
2.7.1 Передача метода в конструктор
2.7.2 Создание отдельного класса с делегатом
2.8 Использование событий
3. Как получить доступ к контролу из другого потока
3.1 Простой и неправильный способ (CheckForIllegalCrossThreadCalls)
3.2 Использование методов Invoke/BeginInvoke
4. Как динамически добавить/удалить контрол.
4.1 Добавление
4.2 Удаление
5. Как создать массив контролов.
6. Как получить доступ к контролу по имени.
7. Как пройтись по всем однотипным котролам.
1. Как создать вторую форму
Любая форма представляет из себя класс, унаследованный от Form.
Экземпляр главной формы создается в файле Program.cs по умолчанию.
C# | ||
|
Чтобы отобразить вторую форму, надо создать экземпляр этого класса (Form2), например в обработчике события главной
C# | ||
|
При этом ShowDialog() блокирует главную форму, т.е. управление вернется в нее, только по закрытию второй формы, а Show() просто отображает вторую форму, т.е. будут доступны обе формы.
2. Как передать данные из одной формы в другую
Часто возникает необходимость передать данные из одной формы в другую, я придумал 7 способов, у каждого свои недостатки и достоинства.
2.1 Изменение модификатора доступа (добавлено 24 июля 2017: лучше воздержаться от применения данного способа)
В Form2 Установить модификатор доступа для контрола/поля public
В любом месте Form1
C# | ||
|
+ Самый быстрый в реализации и удобный способ
— Противоречит всем основам ООП
— Возможна передача только из более поздней формы в более раннюю
— Форма f показывается только с использованием ShowDialog(), т.е. в первую форму управление вернется только по закрытию второй. Избежать этого можно, сохранив ссылку на вторую форму в поле первой формы
2.2 Использование открытого свойства/метода. Способ очень похож на первый
В классе Form2 определяем свойство (или метод)
C# | ||
|
В любом месте Form1
C# | ||
|
+ Противоречит не всем основам ООП
— Минусы те же
2.3 Передача данных в конструктор Form2
Изменяем конструктор Form2
C# | ||
|
А создаем форму в любом месте Form1 так:
C# | ||
|
+ Простой в реализации способ
+ Не нарушает ООП
— Возможна передача только из более ранней формы в более позднюю
2.4 Передача ссылки в конструктор
Изменяем конструктор Form2
C# | ||
|
А создаем форму в любом месте Form1 так, т.е. передаем ей ссылку на первую форму
C# | ||
|
+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
— Нарушает ООП
2.5 Используем свойство ‘родитель’
При создании второй формы устанавливаем владельца
C# | ||
|
Во второй форме определяем владельца
C# | ||
|
+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
+ Не нарушает ООП
2.6 Используем отдельный класс
Создаем отдельный класс, лучше статический, в основном namespace, т.е. например в файле Program.cs
C# | ||
|
Его открытые свойства/методы доступны из любой формы.
+ Самый удобный способ, когда данные активно используются несколькими формами.
2.7 Использование функций обратного вызова
2.7.1 Передача метода в конструктор
Создаем в основном namespace делегат
C# | ||
|
В Form1 создаем метод, который будет обрабатывать принятые данные
C# | ||
|
Создаем вторую форму так:
C# | ||
|
При этом изменяем конструктор второй формы, чтобы он принимал делегат
C# | ||
|
И в любой момент отправляем данные
Полный код
C# | ||
|
i want to open multiple instances of one form and display it in another form or paenel of another form. how to do it
asked Aug 29, 2009 at 12:23
If you’re not using MDI, you can still add a form to another form, or to a panel on a form.
public Form1()
{
InitializeComponent();
Form2 embeddedForm = new Form2();
embeddedForm.TopLevel = false;
Controls.Add(embeddedForm);
embeddedForm.Show();
}
You will need to set the FormBorderStyle
to None
, unless you want to have an actual movable form inside your form.
If you want to do this to create a reusable «template» to use in multiple forms, you should consider creating a user control instead. Not to be confused with a custom control, which is intended for when you need to do your own drawing instead of using collections of standard Windows controls.
I’m not entirely sure what your intentions are, but MDI (as mentioned in one of the other answers) might actually be what you’re looking for.
answered Aug 29, 2009 at 12:30
ThorarinThorarin
46.6k11 gold badges72 silver badges109 bronze badges
6
You should:
1) Choose for MDI, that means accepting the complete MDI style for your GUI
or
2) Not embed Forms at all, it’s better (and easier) to use UserControls. Try them out before you make a choice. If you do use Forms, make sure shortcut keys etc are all working like you want.
Short intro: You design a UserControl like a Form and then place it on a Form like any other Control.
answered Aug 29, 2009 at 14:48
H HH H
258k30 gold badges324 silver badges508 bronze badges
1
Form1 fChild = new Form1();
fChild.MdiParent = this;
fChild.Show();
And the IsMDIContainer
of the parent should be set to True.
For a complete tutorial, you can refer to : Introduction to MDI Forms with C# @ CodeProject.
answered Aug 29, 2009 at 12:27
Moayad MardiniMoayad Mardini
7,2315 gold badges39 silver badges58 bronze badges
1
I came across this older thread looking for something similar. In case anyone else is looking — I used Add New Item >Windows Forms > Inherited Form. It allows you to choose a form to embed as the starting point for another form. This was is in VS 2015 Community Edition.
answered Sep 12, 2016 at 20:12
1
Для
добавления новой формы нам необходимо
следующее: выделим правой кнопкой мыши
название нашего проекта в обозревателе
решений (),
далее в выпадающем списке выполняемДобавить
-> Создать
элемент…
(Ctrl+Shift+A).
В окне добавления нового элемента ищем:
Форма
Windows
Forms.
Вводим и Имя: LWP04Children.cs.
Теперь в обозревателе решений появилась
новая форма:
Настроим
её:
Text |
изменим |
^
Поменяем заголовок формы (то что
отображается в шапке приложения слева).
Icon |
изменим |
Size |
изменим |
^
Поменяем
размер формы.
FormBorderStyle |
изменим |
^
Сделаем окно «неизменяем» по размерам.
MaximizeBox |
изменим |
^
Уберём кнопку Развернуть.
Новая
форма будет выглядеть примерно так:
Рис.
4. 1. Новая добавленная форма приложения
Теперь
надо определиться, как именно быдет
вызываться новая форма. Как модальное
окно, или как подчинённая форма
(родительская форма будет контейнером
для обращение к дочерней форме). Наиболее
интересен второй вариант, так как он
позволяет напрямую обращаться к элементам
дочерней формы, а не ждать завершения
формы. Реализуем сначала этот способ.
Первое
что необходимо сделать для вызова второй
формы из первой это объявить конструктор
класса новой формы:
В
файле кода главной формы (изначально
созданной средой разработки) ищем:
public
partial
class
LWP04Main
: Form
{
После
добавляем:
LWP04Children
dlg = new
LWP04Children();
Добавим
вызывающую кнопку Button
(показан
конечный вариант кнопки):
Параметры
добавленной кнопки таковы:
(Name): |
ButtonShowChildren |
Text: |
Подчинённая |
Size: |
150; |
ToolTip |
Передача |
Событие
Click
кнопки
ButtonShowChildren:
private
void
ButtonShowChildren_Click(object
sender, EventArgs
e)
{
if
(!dlg.Visible)
dlg.Show(this);
}
Если
откомпилировать приложение, нажать на
кнопку тем самым вызван подчинённую
форму, закрыть её и снова нажать на
кнопку, то мы увидим следующую ошибку:
Рис.
4. 2. Ошибка вызванная нажатием кнопки
вызова формы
После
закрытия второй формы объект уничтожается.
Для правильной обработки повторного
вызова нужно добавить событие FromClosing
для формы LWP04Childred:
private
void
LWP04Children_FormClosing(object
sender, FormClosingEventArgs
e)
{
//
Определяем
кто
закрывает
приложение
if
(e.CloseReason == CloseReason.UserClosing)
{
Hide();
e.Cancel
= true;
}
}
Это
правильный обработчик закрытия формы
для нашего приложения. Однако, если в
кнопке закрыть для дочерней формы
применить код уничтожения объекта и
высвобождения ресурсов, то кнопка
Подчинённая форма вновь вызовет подобную
ошибку. Высвобождает ресурс метод
Dispose().
Обработчик
уничтожения формы по нажатию кнопки
Закрыть
может выглядеть так (не
добавляем
для нашего случая, иначе будет потеряна
часть будущей функциональности именно
для этой дочерней формы):
private
void
ButtonClose_Click(object
sender, EventArgs
e)
{
Close();
//
Кнопка Закрыть
Dispose();
//
Уничтожаем окно и все его параметры до
следующего вызова конструктора формы
}
Компилируем
приложение, проверяем работу кнопки.
Соседние файлы в папке Ермаков
- #
- #
- #
- #
- #
- #