Для получения значения из дочернего окна можно установить свойство 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 |
} |
|
}
}
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;
}
}
}
3. 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();
}
Дочерние окна не закрывают родительские элементы управления, поэтому эти ЭУ всегда доступны.
4. Выполнение фоновых приложений. Элемент управления
NotifyIcon
Элемент управления NotifyIcon отображает значок в области уведомлений (SystemTray) панели задач, соответствующий приложению, выполняемому в фоновом режиме.
рис.3
Создайте проект SystemTray. Перетащите на форму из окна ToolBox элементы управления ContextMenu и NotifyIcon. Добавьте в контекстное меню пункты "Показать" (имя пункта – menuShow) и "Скрыть" (имя пункта – menuHide).
Установите следующие свойства элемента notifyIcon1:
свойство |
Значение |
|
|
СontextMenu |
contextMenu1 |
|
|
|
|
Icon |
Icon\ eventlogWarn.ico |
|
|
|
|
Text |
Задача SystemTray |
|
|
|
|
В результате будет сгенерирован следующий код:
private System.Windows.Forms.NotifyIcon notifyIcon1;
notifyIcon1.ContextMenu = contextMenu1; notifyIcon1.Icon =
((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); notifyIcon1.Text = "Задача SystemTray ";
notifyIcon1.Visible = true;
notifyIcon1.DoubleClick += new EventHandler(menuShow_Click);
Изображение, используемое в качестве иконки (свойство Icon) элемента notifyIcon1, будет выводиться в область уведомлений.
Значение свойства Text представляет собой текст всплывающей подсказки, появляющейся при наведении курсора на иконку приложения.
рис.4
В конструкторе формы свойству ShowInTaskbar присваиваем значение false для удаления с панели задач иконки нашего приложения:
public class Form1 : Form
{
InitializeComponent();
// скрываем видимость приложения на панели задач this.ShowInTaskbar = false;
}
Добавляем обработчик пункта меню menuShow:
private void menuShow_Click (object sender, System.EventArgs e)
{
// Отобраем приложение на панели задач при запуске this.ShowInTaskbar = true;
//Показываем форму this.Show();
//Отключаем доступность пункта меню menuShow menuShow.Enabled = false;
//Включаем доступность пункта меню menuHide menuHide.Enabled = true;
}
Обработчик пункта меню menuHide изменяет эти значения на обратные:
private void menuHide_Click (object sender, System.EventArgs e)
{
this.ShowInTaskbar = false; this.Hide();
menuShow.Enabled = true; menuHide.Enabled = false;
}
В режиме дизайна в окне Properties элемента управления notifyIcon1 переключаемся на события и в поле DoubleClick выбираем из списка об-
работчик menuShow_Click.
Примечание.
Можно было создать свой обработчик для события DoubleClick, а
из него вызвать menuShow_Click():
private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
menuShow_Click (this, new EventArgs());
}
В результате обработчиком события notifyIcon1_DoubleClick будет об-
работчик menuShow_Click.
Запускаем приложение.
В области уведомлений появляется иконка, связанная с notifyIcon1.
Пункты контекстного меню отображают и удаляют иконку приложения с панели задач.
390