C#. Windows Forms. Пример создания немодальной формы в Windows Forms приложении. Модальные и немодальные окна

Пример создания немодальной формы в Windows Forms приложении. Модальные и немодальные окна

1. Общие сведения о модальных и немодальных формах

Любая более или менее серьезная программа использует диалоговые окна для организации интерфейса с пользователем. В графическом интерфейсе операционной системы Windows различают два вида диалоговых окон:

  • модальные окна;
  • немодальные окна.

Модальные окна являются наиболее распространенным видом окон. Если открыто модальное окно, то чтобы попасть в основную программу, его обязательно нужно закрыть. Без закрытия модального окна невозможно перейти в программу, которая его вызвала. В программах Windows Forms возможна ситуация, когда одно модальное окно открывает другое (следующее) модальное окно. Таким образом получается цепочка вызовов.

Как правило, модальное окно содержит кнопки типа OK, Cancel (или другие), при нажатии на которые это окно закрывается.

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

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

Пример немодального окна – это команда «Insert Symbol» редактора Microsoft Word, которая позволяет вставлять символ в документ. Из окна вставки символа можно переключаться в основной документ и наоборот, из документа можно переходить в немодальное окно.

 

2. Особенности работы с немодальными окнами в Windows Forms

В технологии Windows Forms основной программе соответствует форма – экземпляр класса, унаследованного от класса Form. Также модальному или немодальному окну соответствует некоторая форма.

При работе с немодальными окнами были замечены следующие особенности:

  • в немодальном окне есть одна кнопка Close, которая его закрывает;
  • вызов немодального окна из главной программы происходит с помощью метода Show() класса Form (чтобы вызвать модальное окно нужно использовать метод ShowDialog()).

В нижеследующем коде приведены примеры вызова модального и немодального окна

// 1. Вызов модального окна
dlgResult = modalForm.ShowDialog();

// Обработка результата возврата, который размещается в dlgResult
// ...

// 2. Вызов немодального окна
nonModalForm.Show(); // здесь не нужно ничего обрабатывать

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

 

3. Способы обмена информацией между главной формой и немодальной формой

При использовании немодальных форм важным есть обмен информацией между основной программой (главной формой) и немодальной формой.

Здесь возможны две ситуации:

  • передача информации из главной формы в немодальную. Эта ситуация решается без проблем, поскольку в основной форме создается экземпляр немодальной формы. Через этот экземпляр осуществляется доступ к компонентам немодальной формы стандартным способом;
  • передача информации из немодальной формы в главную форму. Здесь возникает проблема: как из немодальной формы доступиться к экземпляру главной формы.

Чтобы передать данные (информацию) с немодальной формы в главную, можно использовать один из следующих способов:

  1. С помощью статической ссылки на главную форму. Как известно, статические переменные есть глобальными, поэтому удобно могут использоваться для обмена информацией между разными разделенными экземплярами или процессами. Имея ссылку на главную форму, можно легко обращаться к компонентам этой формы. Этот способ наиболее прост в использовании.
  2. С помощью механизма событий. При этом способе в немодальной форме объявляется событие, которое возникает каждый раз, когда главной форме нужно передать информацию. Тем не менее, сам обработчик этого события помещается в главной форме. Если из немодальной формы нужно передать информацию главной форме, то возникает событие. В результате, в главной форме вызывается обработчик этого события. Этот обработчик получает объект типа «немодальное диалоговое окно», который сгенерировал событие. Имея доступ к измененному объекту немодального окна, можно обновить информацию в главной форме.
  3. С помощью записи информации во временный файл. Как известно, файлы подобны статическим переменным. Поэтому, записав порцию информации в файл в немодальной форме, можно ее прочитать в главной форме. Этот способ не является эффективным, поскольку работает медленнее (чтение из носителей информации происходит дольше чем из оперативной памяти).

 

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

В данной теме описывается пример создания и использования немодальной формы. Для передачи информации из немодальной формы в главную форму используется способ использования статической ссылки на главную форму. При этом способе, перед вызовом немодальной формы запоминается значение экземпляра главной формы в статической переменной. Если нужно передать информацию из немодальной формы в главную форму, то происходит обращение к статической переменной.

Демонстрационная программа состоит из двух форм: главной и немодальной. Из главной формы вызывается немодальная форма. Из немодальной формы происходит копирование информации из поля ввода в соответствующее поле ввода главной формы.

 

4.1. Создать проект типа Windows Forms

После создания проекта по шаблону Windows Forms автоматически создается главная форма, экземпляр которой называется Form1.

 

4.2. Разработка основной формы

Создать основную форму и разместить на ней следующие элементы управления:

  • элемент управления типа Button. Создается экземпляр кнопки с именем button1;
  • элемент управления типа Label. Создается экземпляр метки с именем label1;
  • элемент управления типа TextBox. Создается экземпляр поля ввода с именем textBox1.

Настроить свойства формы и элементов управления как показано на рисунке 1:

  • в элементе управления Form1 свойство Text = «Main Form» (в дальнейшем Form1.Text);
  • button1.Text = «Show Modeless Form»;
  • label1.Text = «Text»;
  • textBox1.Modifiers = Public. Значение Public необходимо, чтобы этот элемент управления был видим из немодальной формы.

Также нужно откорректировать размеры главной формы.

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

C#. Windows Forms. Немодальная форма. Главная форма программы

Рисунок 1. Главная форма программы

 

4.3. Создать новую форму Form2

Создание новой формы осуществляется стандартным способом с помощью команд

Project -> Add Form (Windows Forms...)

В окне, которое откроется, нужно указать шаблон «Form (Windows Forms)». Имя файла оставить по умолчанию Form2.cs. В результате будет создан экземпляр формы с именем Form2.

 

4.4. Проектирование формы Form2

Разместить на форме Form2 следующие элементы управления:

  • один элемент управления типа Label. Будет создан объект с именем label1;
  • два элемента управления типа Button. Будет создано два объекта с именами button1, button2;
  • один элемент управления типа TextBox. Будет создан экземпляр с именем textBox1.

Настроить следующие свойства элементов управления формы Form2:

  • Form2.Text = «Modeless Form»;
  • button1.Text = «Copy to Form1»;
  • button2.Text = «Close»;
  • label1.Text = «Text»;
  • textBox1.Modifiers = Public.

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

C#. Windows Forms. Немодальная форма после настройки элементов управления

Рисунок 2. Немодальная форма Form2 после настройки элементов управления

 

4.5. Ввод статической ссылки на форму Form1

В тексте класса Form1 нужно ввести статическую переменную с именем form1:

...

public partial class Form1 : Form
{
  // Ссылка на текущий экземпляр главной формы - сохраняем
  // в статической переменной, которая доступна из любой части программы
  public static Control form1;

  public Form1()
  {
    InitializeComponent();
  }
}

...

Статическая переменная имеет тип Control. Все элементы управления унаследованы из класса Control. Это же касается и формы.

 

4.6. Программирование обработчика события Click элемента управления button1 формы Form1

При нажатии на кнопке button1 (Show Modeless Form) открывается окно немодальной формы и в поле ввода немодальной формы (Form2.textBox1.Text) вписывается текст из поля ввода главной формы (Form1.textBox1.Text).

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

Текст обработчика события следующий:

// Обработчик события Click элемента управления button1.
// Выполняет следующие действия:
// - вызывает немодальную форму;
// - в textBox1 записывается текст из формы Form1.
private void button1_Click(object sender, EventArgs e)
{
  // 1. Объявить экземпляр немодальной формы
  Form2 f2 = new Form2();

  // 2. Записать в статическую переменную form1 текущий экземпляр
  form1 = this;

  // 3. Отобразить немодальную форму
  f2.Show();

  // 4. Записать в Form2.TextBox1 текст из строки основной формы
  f2.textBox1.Text = this.textBox1.Text;
}

 

4.7. Программирование обработчика события Click кнопки button1 формы Form2

При нажатии на кнопке button1 (Copy to Form1) текст из поля ввода немодальной формы (Form2.textBox1.Text) должен скопироваться в соответствующее поле ввода главной формы (Form1.textBox1.Text).

Сначала нужно активировать форму Form2 и сформировать обработчик события Click элемента управления button1.

Текст обработчика события следующий:

...

// В этом обработчике выполняются следующие операции:
// - содержимое Form2.textBox1 копируется в Form1.textBox1
private void button1_Click(object sender, EventArgs e)
{
  // Получить элемент управления textBox1 главной формы.
  // Для реализации этого осуществляется обход всех элементов
  // управления главной формы.
  for (int i = 0; i < Form1.form1.Controls.Count; i++)
  {
    // Поиск элемента управления textBox1
    if ((Form1.form1.Controls[i] is TextBox)&&
        (Form1.form1.Controls[i].Name == "textBox1"))
    {
      // если textBox1 найден, то записать в него текст из Form2.
      Form1.form1.Controls[i].Text = this.textBox1.Text;
      break;
    }
  }
}

...

В обработчике события на основе статической ссылки form1 происходит циклический поиск элемента управления типа TextBox с именем textBox1 (на всякий случай, если в главной форме несколько textBox-ов).

 

4.8. Программирование обработчика события Click элемента управления button2

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

...

// Закрыть немодальную форму
private void button2_Click(object sender, EventArgs e)
{
  this.Close();
}

...

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

 

4.9. Запуск программы на выполнение

После прохождения инструкции, можно запускать программу. Во время выполнения программы с помощью кнопки «Show Modeless Form» можно вызвать несколько немодальных форм из главной формы (рисунок 3). При этом из второстепенных немодальных форм можно передавать информацию в главную программу поочередно.

C#. Windows Forms. Вызов нескольких форм из немодальной формы

Рисунок 3. Случай, когда из главной формы вызваны 4 немодальных формы


 

0
fb-share-icon20