Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec

.pdf
Скачиваний:
25
Добавлен:
24.03.2015
Размер:
3.43 Mб
Скачать

Для получения значения из дочернего окна можно установить свойство 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;

}

}

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

381

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

Так как 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);

382

}

}

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)

383

{

 

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;

384

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.

385

Форма 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;

}

}

}

386

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

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

{

387

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();

}

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

388

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;

}

389

Добавляем обработчик пункта меню 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]