Visual Studio C#: использование Show() и ShowDialog для отображения окон (форм) Печать
Добавил(а) microsin   

Окна - основные интерфейса GUI-программы Visual Studio. Чтобы создать и отобразить окна, используют экземпляры (переменные) класса Form, и методы Show() и ShowDialog(). В статье рассматривается применение этих методов.

[Обычные окна, использование Show]

Show отображает обычное окно, а ShowDialog - модальное. В программу можно добавить произвольное количество форм (окон), все они будут действовать независимо, если отображены методом Show. Добавляется новое окно так: меню Проект -> Добавить форму Windows... -> Форма Windows Forms -> OK. По умолчанию будет добавлена форма Form2. Далее в модуле Program.cs добавьте код для отображения второй формы:

...
static void Main()
{
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Form2 frm = new Form2(); 
   frm.Show();
   Application.Run(new Form1()); } ...

После запуска программы отобразятся сразу две формы, Form1 и Form2.

Чтобы можно было вызывать из Form1 подпрограммы и функции (методы) из Form2 (и наоборот), то необходимо инициализировать и запускать формы немного по-другому (код из Program.cs):

namespace MyApp
{
   static class Program
   {
      static public Form1 frm1;
      static public Form2 frm2;
 
      /// 
      /// Главная точка входа для приложения.
      /// 
      [STAThread]
      static void Main()
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         frm1 = new Form1();
         frm2 = new Form2();
         frm2.Show();
         Application.Run(frm1);
      }
   }
}

Пример вызова из класса Form2 (процедура Form2_FormClosed) метода класса Form1 (процедуру Close):

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
   Program.frm1.Close();
}

[Модальные окна, использование ShowDialog]

Модальное окно должно блокировать другие окна, пока не будет закрыто модальное окно. Обычно модальное окно используется для диалогов настройки, а также для фокусирования внимания пользователя на каком-то событии. В приложении в любое время может быть активно и доступно для пользователя только одно модальное окно. Часто диалог About тоже запускают как модальное окно.

Любую обычную форму можно запустить как модальное окно, если вместо Show() использовать ShowDialog(). Пример запуска диалогового (модального) окна настройки, вызываемого из меню:

      private void SetupStripMenuItem_Click(object sender, EventArgs e)
      {
         //Program.form2.Show();
         Program.form2.ShowDialog();
      }

[Важные отличия Show от ShowDialog]

1. Show() запускает отображение обычного окна, а ShowDialog() отображает модальное окно. Отличия обычного окна от модального известны - обычное окно равноправно со всеми окнами приложения, а модальное окно блокирует все остальные окна приложения, пока не будет закрыто это модальное окно.

2. Если после вызова Show() пользователь закроет вызванное окно, то повторно вызвать Show() не получится, так как объект окна будет уничтожен, и его надо будет создавать заново. Т. е. Использование Show() всегда должно быть по такой схеме: создание экземпляра класса окна (), Show(), закрытие окна. При каждом вызове Show() экземпляр класса окна нужно создавать заново в коде приложения.

3. ShowDialog() работает по другому: после закрытия пользователем окна (в отличие от Show()) экземпляр класса окна не будет уничтожен, поэтому не нужно перед каждым новым вызовом ShowDialog создавать экземпляр класса. Этот экземпляр класса может быть создан только один раз при старте приложения (например, в функции Main модуля Program.cs).

4. Свойства модального окна нужно менять в самом классе этого окна, а не из классов других окон, так как действие кода из другого класса не будет производить никакого эффекта на модальное окно. Например, поменять свойства Top и Left модального окна, влияющие на его положение, из модулей других окон не получится.

[Ссылки]

1C#: часто задаваемые вопросы (FAQ).