Назад Вперед Содержание

Многооконный интерфейс

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

Пример 1

Создать меню, состоящее из пунктов Input, Calc и Exit.

При выборе команды Input открывается диалоговое окно, содержащее:

При выборе команды Calc открывается окно с результатами.

При выборе Exit приложение завершается.

В проекте будет использоваться три окна:

  1. Главное окно, содержащее меню;
  2. Диалоговое (модальное) окно, содержащее поле ввода и чекбоксы; При нажатии на кнопку ОК выполняются вычисления, при нажатии на Cancel окно закрывается.
  3. Окно, в которое будет выводиться результат (не модальное).

Передача параметров из окна в окно

Для обмена данными между формами создадим статический класс, который будет содержать два поля: площадь круга и длину окружности, а также свойства для доступа к этим полям. Назовем этот класс просто Class1.

При нажатии кнопки ОК в диалоговом окне Form2, поля s, l получат значения.

При выборе пункта меню Calc в третье окно Form3 будут выводится значения этих полей.

Добавлениe еще одной формы

Для добавления еще одной формы в проект нужно выполнить команду:

Указываем имя формы или оставляем предложенное

Главная форма. Меню Input. Name

Главная форма. Меню Input. Click

Главная форма. Обработчики

Диалоговое окно. Свойства формы

Для модального (диалогового) окна необходимо установить такие свойства:

Диалоговое окно. Обработчик события Click кнопки ОК (button1)

Значения S и L помещаются в поля статического класса Class1

Окно результатов. Конструктор

Присвоить пробел всем меткам.

Окно результатов. Обработчик события Load формы Form3

Значения S и L выбираются из полей статического класса Class1 и помещаются на форму Form3

Пример 2

Усложним наш пример. Создать меню, состоящее из пунктов Input, Calc и Exit.Пункт Calc -неактивен.

При выборе команды Input открывается диалоговое окно, содержащее:

При выборе Exit на главной форме приложение завершается. При выборе команды Calc открывается окно с результатами.

Пишем код первой(главной) формы.

Здесь используется метод Control.ControlCollection.Find (String,?Boolean),который выполняет поиск элементов управления по их свойству Name и создает массив из всех элементов управления, которые соответствуют указанному значению этого свойства.Параметры:

Пишем код второй формы.

Пишем код третьей формы.

Пример 3

Рассмотрим еще одно рещение этой задачи, а именно, передадим форму2 в форму3 как параметр. Создать меню, состоящее из пунктов Input, Calc и Exit.Пункт Calc -неактивен.

При выборе команды Input открывается диалоговое окно, содержащее:

При выборе Exit на главной форме приложение завершается. При выборе команды Calc открывается окно с результатами.

Пишем код первой(главной) формы.

Пишем код второй формы.

Пишем код третьей формы.

Здесь используется метод Control.ControlCollection.Find (String,?Boolean),который выполняет поиск элементов управления по их свойству Name и создает массив из всех элементов управления, которые соответствуют указанному значению этого свойства.Параметры:

Пример 4

В дизайнере создаем главную форму (она будет запускаться при запуске приложения). Поместим один TextBox и Button.

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

Аналогично первой, она имеет те же контролы. Больше нам и не надо. Точка входа в приложение запускает главную форму:

Код главной формы выглядит так:

Соответственно, не забудьте подключить кнопку на событие Click. Здесь, в классе главной формы, есть поле SecondForm secondForm, представляющее объект- вторую форму. При нажатии на кнопке «Передать», создается вторая форма (вызывается перегруженный конструктор, его мы еще создадим) и запускается методом ShowDialog(). В данном случае нам подходит именно этот метод. При чем, после этого мы обязательно проверяем, не закрыли ли вторую форму, а выполнили клик по её кнопке. Если, на второй форме был выполнен клик по кнопке, значит первая форма должна принять данные от второй. Это происходит путем вызова метода ReturnData() у второй формы.

Теперь самое интересное – код второй формы:

Как видим, имеется единственная перегрузка конструктора, который принимает тип string. Помним, что мы пытаемся передавать текст из TextBox. В конструкторе происходит плановая инициализация компонент и установка текста текстового поля в переданное значение от первой формы. Далее, подписавшись на событие Click для кнопки второй формы, мы создали обработчик btn_secondForm_Click, который и имитирует работу кнопки «Ok» любого диалогового окна. Таким образом, нажимая на кнопке «Отправить» (второй формы), мы приводим в исполнение условие

(secondForm.DialogResult == DialogResult.OK) первой формы, ввиду чего, вызывая метод secondForm.ReturnData(), мы устанавливаем тектовое поле первой формы в значение текстового поля второй формы.

Работа данного метода, я думаю, уже не требует пояснений. Он просто возвращает текст из единственного текстового поля, при этом, оставляя его приватным.

В итоге, мы передали данные во вторую форму из первой и со второй в первую не нарушая принципы инкапсуляции.

Попробуйте внести текст «ааа» в текстовое поле первой формы и выполнить нажатие на кнопке. Вы увидите в открывшейся второй форме этот текст в её текстовом поле. Попробуйте изменить текст на «ааа ппп» и нажать на кнопку. Вы увидите как после закрытия второй формы данный текст отобразится в текстовом поле главной формы.

Назад Вперед Содержание