Диалоговые модальные SDI-окна

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002227.docx

Диалоговые модальные 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

}

}

}