Диалоговые модальные SDI-окна
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Новая форма добавляется в проект, как и любой другой элемент. В случае создания многооконного приложения, дочерних форм может быть несколько. Каждая форма может содержать свои ЭУ.

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

· конструктор – форма создается;

· Load                – форма существует, но не отображена;

· Activated – форма становится видимой и текущей. (Идет серия сообщений! Использовать не удалось.)

 

Исключение. Для Visible=true (Show c Visible=true):

· конструктор до Visible=true – форма создается, отображается и становится текущей;

· Load                     

· Activated      

· конструктор после Visible=true – форма создается;

 

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

· Closing     – попытка закрыть форму

· (CancelEventArgs e.Cancel=true – оставить форму открытой, false – закрыть);

· Closed      – после закрытия формы;

· Deactivate – после закрытия формы

 

Модальные диалоговые окна создаются методом ShowDialog().  

Родительская форма блокируется до завершения работы с дочерней.

Завершить работу дочерняя форма может либо закрыв себя методом Close(), либо сделав себя невидимой (Visible=false). В последнем случае дочерняя форма остается открытой, но управление возвратится в родительскую форму, которая может выполнить Visible=true и опять сделать дочернюю форму видимой. Открытую дочернюю форму frm2 может закрыть родительская форма - frm2.Cancel().

 

private void Form1_Load(object sender, EventArgs e)

{

Visible = true; //принудительно высветить родительскую форму

Enabled = false; //погасить все поля

this.BackColor = System.Drawing.SystemColors.ControlDark;

 

Form2 dialog = new Form2();

dialog.ShowDialog();

 

Enabled = true;

this.BackColor = System.Drawing.SystemColors.Control;

. . .

 

Для получения значения из дочернего окна можно установить свойство DialogResult кнопок в соответствующее значение: OK, Cancel и др. Выбор этих кнопок завершает работу с окном, но оставляет ее открытой. Метод ShowDialog() возвращает код нажатой клавиши в виде перечисления DialogResult.

 

 

рис.1

 

Пример получения информации о завершении работы дочерней формы:

private void button3_Click(object sender, EventArgs e)

{

Form2 dialog = new Form2();

 

DialogResult result = dialog.ShowDialog();

 

// здесь доступны свойства формы dialog

// например, string str = dialog.val1;

 

dialog. Close();

switch (result)

{

   case DialogResult.Yes:

 

       MessageBox.Show("Выбрано ДА");

       break;

 

   case DialogResult.No:

 

       MessageBox.Show("Выбрано НЕТ");

       break;

}

}

 

Не зависимо от того закрыли ли мы дочернюю форму или нет, при выходе из метода, ее создавшего, ссылка на дочернюю форму выйдет из области видимости и будет уничтожена сборщиком мусора. Пока ссылка не уничтожена, свойства дочерней формы (как и другие открытые члены) остаются доступными в родительской форме.

Так как ShowDialog() не создает новых экземпляров, то его можно выдавать повторно: все старые значения формы будут видны.

 

Пример получения информации от дочерней формы.

Необходимо в форму добавить свойства для возврата передаваемых значений. Пока управление не покинет обработчик, который создал дочернее окно, все открытые члены дочерней формы достуны.

 

 

рис.2

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

public partial class Form1 : Form

{

public Form1()

{ InitializeComponent(); }

 

private void button3_Click(object sender, EventArgs e)

{

   Form2 dialog = new Form2();

 

  // здесь можно передать значения форме 2 через ее свойства

 

   dialog.ShowDialog();

 

   int v = dialog.Val1;

   MessageBox.Show ("Значение 1 = " + v);

   MessageBox.Show ("Значение 2 = " + dialog.Val2);

}

}

 

public partial class Form2 : Form

{

int val1, val2;

 

public Form2()

{

   InitializeComponent();

}

 

public int Val1

{ get { return val1; }

    set { val1 = value; } 

}

 

public int Val2

{ get { return val2; }

    set { val2 = value; } 

}

 

private void button1_Click(object sender, EventArgs e)

{

   Val1 = 12;

   Val2 = 145;

   Close();

}

}

 

Передача параметров в дочернюю форму с ее отображением с помощью ее же метода.

 

В вызываемой форме:

// формирование динамического массива

  . . .

// создание формы2 и вызов ее метода для ее визуализации

// с передачей параметра.

Form2 f2 = new Form2();

  f2.AddLab(array1);

      . . .

 

Форма 2:

public partial class Form2 : Form

{

      private ArrayList arrayList1;

 

   public Form2()

   {

       InitializeComponent();

   }

 

   public void AddLab (ArrayList arList)

   {      

       arrayList1= arList;         // получить доступ к массиву Формы 1

 

        this.ShowDialog();      // отображение Формы 2

   }

 

   private void button3_Click(object sender, EventArgs e)

   {

. . . . . . . . .

       this.Close();     // закрыть форму 2

   }

}

}

 

Диалоговые НЕмодальные окна

Создание немодальных диалогов с передачей и возвратом параметров.

Окно немодального диалога создается методом Show().

Особенности:

1. Управление после создания формы немедленно передается на следующий оператор после Show().

 

2. Родительская форма продолжает получать сообщения.

 

3. Родительская форма не получает никакого уведомления о том, что дочерняя форма закрыта.

 

Статическое свойство OpenForms класса Application возвращает коллекцию открытых форм, из которой можно выбрать ссылку на требуемую форму:

 

    Form1 f1 = (Form1)Application.OpenForms["Form1"];

 

Первый вариант.

Создаем немодальные окна. Управляем доступностью форм.

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

Для запрещения создания других форм-дубликатов, кроме первой Form2, в Form1 используем свойство this.Enabled = false. При выходе из формы Form2 (события Form2_FormClosing или Form2_FormClosed) разрешаем (f1.Enabled = true) использование формы Form1.

По кнопке Закрыть или по меню Закрыть закрываем форму и делает ее невидимой.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsApplication1

{

public partial class Form1 : Form

{

   public Form1()

   {

       InitializeComponent();

   }

 

   private void button1_Click (object sender, EventArgs e)

   {

       Form2 f2 = new Form2();

       this.Enabled = false;

       f2.Show();

   }

}

}

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsApplication1

{

public partial class Form2 : Form

{

   public Form2()

   {

       InitializeComponent();

   }

 

 

   private void Form2_FormClosing (object sender,

                                                                                 FormClosingEventArgs e)

   {

       // так как форма Form1 не закрыта, она доступна

       Form1 f1 = (Form1)Application.OpenForms["Form1"];

       f1.Enabled = true;  

   }

}

}

 

Второй вариант.

Создаем немодальные окна. Управляем видимостью форм.

Перед вызовом Form2, в Form1 устанавливаем ее невидимость: this.Visible = false. При выходе из формы Form2 (события Form2_FormClosing или Form2_FormClosed) устанавливаем видимость (f1.Visible = true) формы Form1.

Форма Form2 становится невидимой при выходе из формы по кнопке Закрыть или по меню Закрыть.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsApplication1

{

public partial class Form1 : Form

{

   public Form1()

   {

       InitializeComponent();

   }

 

   private void button1_Click (object sender, EventArgs e)

   {

       Form2 f2 = new Form2();

       this.Visible = false;

       f2.Show();

   }

}

}

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsApplication1

{

public partial class Form2 : Form

{

   public Form2()

   { InitializeComponent(); }

 

 

   private void Form2_FormClosing (object s,

                                                                                          FormClosingEventArgs e)

   {

       Form1 f1 = (Form1)Application.OpenForms["Form1"];

       f1.Visible = true;  

   }

}

}

Способ использования данных из других форм

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsApplication1

{

public partial class Form1 : Form

{

 

   public Form1()

   { InitializeComponent(); }

 

   public string strF1 = "форма1 ";

   Form2 f2 = null;

 

   private void button1_Click(object sender, EventArgs e)

   {

       this.Enabled = false;

         f2 = new Form2();

           

       f2.Show();

// show=true;

   }

 

 

   // Нельзя щелкать на второй кнопке раньше первой,

   // так как f2 будет = null

   private void button2_Click(object sender, EventArgs e)

     {

       // Здесь д.б. проверка на то, что форма 2 отработала: if (show) ...

       // Используем строку из формы 2,

       // так как объект f2 не уничтожен.

       MessageBox.Show(f2.strF2);

   }

}

}

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsApplication1

{

public partial class Form2 : Form

{

 

   public Form2()

   { InitializeComponent(); }

 

   public string strF2 = "форма2 "; 

 

 

   private void Form2_FormClosed(object sender,

                                                             FormClosedEventArgs e)

   {

       strF2 = "Изменили строку в Форме 2";

 

       // Используем строку из формы 1,

       // так как объект f1 не уничтожен.

       Form1 f1 = (Form1)Application.OpenForms["Form1"];

       MessageBox.Show (f1.strF1);

       f1.Enabled = true;  

  }

}

}

 

MDI приложения

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

В родительском окне необходимо установить свойство IsMdiContainer в true.

Как правило, у родительского окна создают пункт меню «Окно» со свойством MdiList=true. В этом случае в пункт «Окно» будут автоматически добавляться подпункты, образующие список всех открытых окон.

Новая форма добавляется в проект, как и любой другой элемент.

Для MDI приложения конструируется, как правило, только одна дочерняя форма, на основе которой создается несколько дочерних окон.

Для того чтобы создаваемое окно отображалось как дочерняя форма приложения, необходимо установить его свойство MdiParent равным this.

Окно создается в обработчике события меню методом Show().

 

Пример:

 

private void menuNew_Click(object sender, EventArgs e)

{

Form2 wnd = new Form2();

wnd.MdiParent = this;

wnd.Show();

}

 

Дочерние окна не закрывают родительские элементы управления, поэтому эти ЭУ всегда доступны.

 

Дата: 2019-02-02, просмотров: 242.