При работе с несколькими формами надо учитывать, что одна из них является главной - которая запускается первой в файле Program.cs. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Создать меню, состоящее из пунктов Input, Calc и Exit.
При выборе команды Input открывается диалоговое окно, содержащее:
При выборе команды Calc открывается окно с результатами.
При выборе Exit приложение завершается.
В проекте будет использоваться три окна:
Для обмена данными между формами создадим статический класс, который будет содержать два поля: площадь круга и длину окружности, а также свойства для доступа к этим полям. Назовем этот класс просто Class1.
При нажатии кнопки ОК в диалоговом окне Form2, поля s, l получат значения.
При выборе пункта меню Calc в третье окно Form3 будут выводится значения этих полей.
Для добавления еще одной формы в проект нужно выполнить команду:
Указываем имя формы или оставляем предложенное
Для модального (диалогового) окна необходимо установить такие свойства:
Значения S и L помещаются в поля статического класса Class1
Присвоить пробел всем меткам.
Значения S и L выбираются из полей статического класса Class1 и помещаются на форму Form3
Усложним наш пример. Создать меню, состоящее из пунктов Input, Calc и Exit.Пункт Calc -неактивен.
При выборе команды Input открывается диалоговое окно, содержащее:
При выборе Exit на главной форме приложение завершается. При выборе команды Calc открывается окно с результатами.
Пишем код первой(главной) формы.
Здесь используется метод Control.ControlCollection.Find (String,?Boolean),который выполняет поиск элементов управления по их свойству Name и создает массив из всех элементов управления, которые соответствуют указанному значению этого свойства.Параметры:
Пишем код второй формы.
Пишем код третьей формы.
Рассмотрим еще одно рещение этой задачи, а именно, передадим форму2 в форму3 как параметр. Создать меню, состоящее из пунктов Input, Calc и Exit.Пункт Calc -неактивен.
При выборе команды Input открывается диалоговое окно, содержащее:
При выборе Exit на главной форме приложение завершается. При выборе команды Calc открывается окно с результатами.
Пишем код первой(главной) формы.
Пишем код второй формы.
Пишем код третьей формы.
Здесь используется метод Control.ControlCollection.Find (String,?Boolean),который выполняет поиск элементов управления по их свойству Name и создает массив из всех элементов управления, которые соответствуют указанному значению этого свойства.Параметры:
В дизайнере создаем главную форму (она будет запускаться при запуске приложения). Поместим один TextBox и Button.
По нажатию на кнопке будет открываться вторая форма и текст из текстового поля главной формы передастся в текстовое поле второй формы.
Аналогично первой, она имеет те же контролы. Больше нам и не надо. Точка входа в приложение запускает главную форму:
Код главной формы выглядит так:
Соответственно, не забудьте подключить кнопку на событие Click. Здесь, в классе главной формы, есть поле SecondForm secondForm, представляющее объект- вторую форму. При нажатии на кнопке «Передать», создается вторая форма (вызывается перегруженный конструктор, его мы еще создадим) и запускается методом ShowDialog(). В данном случае нам подходит именно этот метод. При чем, после этого мы обязательно проверяем, не закрыли ли вторую форму, а выполнили клик по её кнопке. Если, на второй форме был выполнен клик по кнопке, значит первая форма должна принять данные от второй. Это происходит путем вызова метода ReturnData() у второй формы.
Теперь самое интересное – код второй формы:
Как видим, имеется единственная перегрузка конструктора, который принимает тип string. Помним, что мы пытаемся передавать текст из TextBox. В конструкторе происходит плановая инициализация компонент и установка текста текстового поля в переданное значение от первой формы. Далее, подписавшись на событие Click для кнопки второй формы, мы создали обработчик btn_secondForm_Click, который и имитирует работу кнопки «Ok» любого диалогового окна. Таким образом, нажимая на кнопке «Отправить» (второй формы), мы приводим в исполнение условие
(secondForm.DialogResult == DialogResult.OK) первой формы, ввиду чего, вызывая метод secondForm.ReturnData(), мы устанавливаем тектовое поле первой формы в значение текстового поля второй формы.
Работа данного метода, я думаю, уже не требует пояснений. Он просто возвращает текст из единственного текстового поля, при этом, оставляя его приватным.
В итоге, мы передали данные во вторую форму из первой и со второй в первую не нарушая принципы инкапсуляции.
Попробуйте внести текст «ааа» в текстовое поле первой формы и выполнить нажатие на кнопке. Вы увидите в открывшейся второй форме этот текст в её текстовом поле. Попробуйте изменить текст на «ааа ппп» и нажать на кнопку. Вы увидите как после закрытия второй формы данный текст отобразится в текстовом поле главной формы.