Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
74
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

8. Модификация приложения Windows Forms: динамическое связывание параметров двух форм и передача параметра через свойства

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

Для реализации этого способа воспользуемся двумя элементами и разместим их на уже созданой ранее форме. Возмём форму LWP04Children, и два элемента: ComboBox ( ) и ListBox.

Рис. 8. 1. Элемент управления ListBox на панели элементов

Разместим оба элемента как показано на рисунке ниже (ComboBox слева):

Рис. 7. 1. Расстановка элементов на форме LWP04Children

Слегка расширим форму, чтобы наглядно уместить всё.

Параметры ComboBox таковы:

(Name):

CB

Size:

225; 21

Параметры ListBox таковы:

(Name):

LB

Size:

225; 69

Теперь добавим свойство, которое будет переходным классом для параметров форм. Откроем файл LWP04Children.cs. И найдём:

{

Close();

}

Добавим после:

public string ComboText

{

get { return CB.Text; }

set { if (value != "") CB.Items.Add("ComboBox: [" + value + "]"); }

}

Меняем обработчик самой первой нашей кнопки (ButtonShowChildren) следующим образом (добавляем последнюю строчку работы со свойством:

private void ButtonShowChildren_Click(object sender, EventArgs e)

{

if (!dlg.Visible)

dlg.Show(this);

dlg.ComboText = TextBoxMain.Text; // Вызываем строковый параметр ComboText и метод set

dlg.ListText = TextBoxMain.Text;

if (dlg.ComboText != "")

LBMain.Items.Add(dlg.ComboText);

}

Смысл тут ясен. Вызывается метод set если ComboText слева. И get если… да, справа (операция получения значения). При нажатии на кнопку вызова формы, в ComboBox добавляется значение (если значение которое надо добавить не пустое). Теперь реализуем получение значения из ComboBox например при изменении значения. Добавим на нашу главную форму ещё один ListBox с именем:

(Name):

LBMain

Код события двойного нажатия по элементу ListBox главной формы обновляем следующим образом:

private void LBMain_MouseDoubleClick(object sender, MouseEventArgs e)

{

if (dlg.ComboText != "") // Проверяем значение которое добавляем (должно быть не пусто)

LBMain.Items.Add(dlg.ComboText);

if (dlg.ListText != "") // Проверяем значение которое добавляем (должно быть не пусто)

LBMain.Items.Add(dlg.ListText);

if (LBMain.Items.Count > 4) // Очищаем все значения элемента, если их число больше 4

LBMain.Items.Clear();

}

И разберёмся с ListBox для дочерней формы. Код для формы такой (добавим после ComboText):

public string ListText

{

get { return LB.Text; }

set { if (value != "") LB.Items.Add("ListBox: [" + value + "]"); }

}

Код для кнопки Подчинённая форма:

private void ButtonShowChildren_Click(object sender, EventArgs e)

{

if (!dlg.Visible)

dlg.Show(this);

dlg.ComboText = TextBoxMain.Text; // Вызываем строковый параметр ComboText и метод set

dlg.ListText = TextBoxMain.Text; // Вызываем строковый параметр ListText и метод set

}

Код для события самого ListBox (двойном нажатии на элементе):

private void LB_SelectedIndexChanged(object sender, EventArgs e)

{

Close();

}

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

private void LWP04Children_MouseEnter(object sender, EventArgs e)

{

if (CB.Items.Count > 4)

CB.Items.Clear();

if (LB.Items.Count > 4)

LB.Items.Clear();

}

Теперь при нажатии на кнопку Подчинённая форму, в ComboBox И ListBox будут добавлять записи типа ComboBox: [<текст из поля главной формы>]. Выбираем значение в ComboBox или ListBox, после чего дважды нажимаем на поле ListBox главной формы и туда автоматически добавятся новые значения (выбранные курсором в дочернем окне). При переполнения какого-либо элемента управления (более четырёх записей), все значения удаляются переполненного из элемента.

Последнее что мы сделаем, это покажем на примере, как работает уничтожение формы при помощи метода Dispose(). Для формы, вызываемой кнопкой Для делегата № 1 поменяем код кнопки Закрыть:

private void ButtonClose_Click(object sender, EventArgs e)

{

Close(); // Кнопка Закрыть

Dispose(); // Уничтожаем окно и все его параметры до следующего вызова конструктора формы

}

Теперь если закрыть форму, вызванную кнопкой Для делегата № 1 через кнопку Закрыть (не крестик в заголовке или Alt+F4), то данные дочеренего окна будут уничтожены (после передачи в главную форму) и к ним не буде доступа до следующего вызова формы. Это можно увидеть по всплывающему окошку, а точнее его обрезанному заголовку после уничтожения формы:

Рис. 8. 3. Всплывающее окошко без части заголовка