Windows Forms - работа с формами

Создание и модификация приложения Windows Forms. Динамическое связывание параметров двух форм и передача параметра через прямой доступ к элементу формы. Передача параметра через передачу метода в конструктор формы, класс делегата и через свойства.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 24.04.2017
Размер файла 2,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Лабораторная работа № 4: Windows Forms - работа с формами

Содержание

1. Вводная часть

2. Создание приложения Windows Forms

3. Модификация приложения Windows Forms

4. Модификация приложения Windows Forms: добавление новой формы

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

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

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

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

9. Завершающая часть

10. О приложении к Лабораторной работе № 4

1. Вводная часть

приложение windows forms форма

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

В этой работе будут рассмотрены способы создания дополнительных форм (новых окон) в приложениях Windows Forms и обмен данными между всеми окнами приложения.

Целью данной работы станет создание приложения для демонстрации работы приложения с более чем одной формой. В частности рассмотрим:

1. Создание и настройка второй формы. Реализация «многооконности».

2. Многооконность: свободные окна и динамический обмен данными между ними.

3. Многооконность: модальные окна (окна перехватывающие фокус и блокирующие доступ к другим окнам) и статический/ динамический обмен данными между ними.

4. Передача параметра из одной формы в другую. Применим четыре различных способа (наиболее интересных).

Первый способ: передача параметров через прямой доступ к элементу формы. Изменение модификатора доступа к элементу управления.

Второй способ: передача метода в конструктор формы.

Третий способ: создание отдельного класса с делегатом. Совмещение второго и третьего способов.

Четвёртый способ: передача параметров через свойства.

2. Создание приложения Windows Forms

Запускам Visual Studio 2010, откроется Начальная страница:

Для начала, надо создать проект, для этого выполним последовательно: Файл -> Создать -> Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N или пункт «Создать проект…» на Начальной странице):

Рис. 2.1 Создание нового проекта

Выберем слева в пункте Установленные шаблоны язык Visual C#, далее найдём в списке Приложение Windows Forms. Также здесь можно выбрать какой использовать «фреймворк» (набора компонентов для написания программ). В нашем случае выберем.NET Framework 4.

Рис. 2.2 Окно создания нового проекта

В поле Имя вводим LWP04WindowsForms03 -- это название программы (выбрано по названию лабораторного практикума, номеру и названию работы). В поле Расположение указана конечная директория где будет находится весь проект. Выберем расположение удобное для быстрого поиска. В поле Имя решения вводится либо название программы «по умолчанию» из поля Имя автоматически, либо можно ввести своё собственное. Под этим именем будет создана конечная папка проекта (если Имя и Имя решения разные).

Рис. 2.3 Вводим данные нового проекта приложения Windows Forms

После нажатия клавиши ОК мы увидим сформированный проект и исходный код приложения Windows Forms (не пустого изначально).

Рис. 2.4 Обозреватель решений: состав проекта приложения Windows Forms сформированного средой разработки

Теперь, можно откомпилировать созданную программу, нажав клавишу F5 (Отладка -> Начать отладку или нажав на иконку . Тем самым мы запускаем приложение в режиме отладки (и производим компиляцию debug-версии программы) (Debug выбрано изначально).

Рис. 2.5 Запуск приложения Windows Forms по конфигурации Debug

3. Модификация приложения Windows Forms

Для начала изменим размер нашей единственной формы. Для этого можно потянуть за уголок в нужном направлении на странице визуального представления формы1. Но также размер можно менять на панели свойств этой формы. Для этого нужно поменять значение размера в пикселях (высоту и ширину) в поле Size.

ПРИМЕЧАНИЕ № 1: Для перехода на визуальное представление формы, необходимо двойным нажатием в обозревателе решений нажать на значок формы () или выбрать вкладку на панели вкладок с именем <имя формы>.cs [Конструктор].

Задаём следующие параметры формы на панели Свойства:

(Name)

изменим с Form1.cs2 на LWP04Main

^ Поменяем внутреннее имя формы.

Text

изменим с Form1 на Windows Forms (C#)

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

Icon

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

Size

изменим со значений 300; 300 на 500; 350

^ Поменяем размер формы.

ПРИМЕЧАНИЕ № 2: Для того, чтобы поменять имя файла нашей формы, необходимо выполнить следующее: выделить в обозревателе решений значёк формы () и нажать правую кнопку мыши, затем выбрать Переименовать. Ввести необходимое новое имя СОХРАНЯЯ расширение *.cs. После смены имени, автоматически поменяются имена проассоциированных непосредственно с формой файлов:

Получим нечто подобное:

Рис. 3.1 Модифицированная форма приложения

Добавим на нашу форму ToolTip (). Этот элемент управления уже рассматривался в предыдущей лабораторной работе практикума.

Параметры добавленного элемента всплывающей подсказки таковы:

(Name):

Hint

4. Модификация приложения Windows Forms: добавление новой формы

Для добавления новой формы нам необходимо следующее: выделим правой кнопкой мыши название нашего проекта в обозревателе решений (), далее в выпадающем списке выполняем Добавить -> Создать элемент… (Ctrl+Shift+A). В окне добавления нового элемента ищем: Форма Windows Forms. Вводим и Имя: LWP04Children.cs. Теперь в обозревателе решений появилась новая форма:

Настроим её:

Text

изменим с LWP04Children на Работа с окнами (C#):: Подчинённая форма

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

Icon

изменим изображение (иконку) формы

Size

изменим со значений 300; 300 на 500; 100

^ Поменяем размер формы.

FormBorderStyle

изменим с Sizable на FixedDialog

^ Сделаем окно «неизменяем» по размерам.

MaximizeBox

изменим с True на False

^ Уберём кнопку Развернуть.

Новая форма будет выглядеть примерно так:

Рис. 4.1 Новая добавленная форма приложения

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

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

В файле кода главной формы (изначально созданной средой разработки) ищем:

public partial class LWP04Main: Form

{

После добавляем:

LWP04Children dlg = new LWP04Children();

Добавим вызывающую кнопку Button (показан конечный вариант кнопки):

Параметры добавленной кнопки таковы:

(Name):

ButtonShowChildren

Text:

Подчинённая форма

Size:

150; 23

ToolTip на Hint:

Передача параметра через прямой доступ к элементам управления

Событие Click кнопки ButtonShowChildren:

private void ButtonShowChildren_Click(object sender, EventArgs e)

{

if (!dlg.Visible)

dlg.Show(this);

}

Если откомпилировать приложение, нажать на кнопку тем самым вызван подчинённую форму, закрыть её и снова нажать на кнопку, то мы увидим следующую ошибку:

Рис. 4.2 Ошибка вызванная нажатием кнопки вызова формы

После закрытия второй формы объект уничтожается. Для правильной обработки повторного вызова нужно добавить событие FromClosing для формы LWP04Childred:

private void LWP04Children_FormClosing(object sender, FormClosingEventArgs e)

{

// Определяем кто закрывает приложение

if (e.CloseReason == CloseReason.UserClosing)

{

Hide();

e.Cancel = true;

}

}

Это правильный обработчик закрытия формы для нашего приложения. Однако, если в кнопке закрыть для дочерней формы применить код уничтожения объекта и высвобождения ресурсов, то кнопка Подчинённая форма вновь вызовет подобную ошибку. Высвобождает ресурс метод Dispose().

Обработчик уничтожения формы по нажатию кнопки Закрыть может выглядеть так (не добавляем для нашего случая, иначе будет потеряна часть будущей функциональности именно для этой дочерней формы):

private void ButtonClose_Click(object sender, EventArgs e)

{

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

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

}

Компилируем приложение, проверяем работу кнопки.

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

Добавим для двух форм приложения два текстовых поля. Для формы LWP04Main добавим TextBox ():

Параметры добавленного текстового поля редактирования таковы:

(Name):

TextBoxMain

Modifiers:

Public

Событие TextChanged текстового поля редактирования TextBoxMain:

private void TextBoxMain_TextChanged(object sender, EventArgs e)

{

dlg.TextBoxChildren.Text = TextBoxMain.Text; // При изменении текста в поле TextBoxMain тоже самое происходит в поле TextBoxChildren

}

Для формы LWP04Children добавим TextBox ():

Рис. 5.1 Расстановка элементов на добавленной форме LWP04Children

Параметры добавленного тектового поля редактирования таковы:

(Name):

TextBoxChildren

Modifiers:

Public

Событие Load формы LWP04Main:

private void LWP04Main_Load(object sender, EventArgs e)

{

dlg.TextBoxChildren.TextChanged += new EventHandler(LWP04Main_Load); // Определяем, что прозизошло изменение текста в TextBoxChildren и вызываем событие Load

TextBoxMain.Text = dlg.TextBoxChildren.Text;

}

Рис. 5.2 Свойства элемента управления TextBoxMain: значения поля свойства Modifiers

Параметры добавленной кнопки Закрыть:

(Name):

ButtonClose

Text:

Закрыть

Size:

75; 23

Событие Click кнопки ButtonCLose:

private void ButtonClose_Click(object sender, EventArgs e)

{

Close();

}

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

Рис. 5.3 Динамическое изменение значений текстовых полей двух форм

Единственны «минус» такого варианта работы с формами, это атрибут public для поля Modifiers элементов управления. То есть этот вариант можно использовать, но безопасность данных в элементе управления в этом случае ставится под сомнение изначально. Потому что этот элемент и все его свойства, поля и данные становятся «видимыми» из любого места приложения. Под «безопасностью» понимаем не взлом приложения, а доступность данных внутри приложения и возможное нарушение согласования типов при манипуляции с переменными. То есть нарушается принцип инкапсуляции. Если приходится открывать то что должно приватным, значит что то не правильно в архитектуре приложения.

Следующие два способа, объединены общими принципами сохранения основ ООП и инкапсуляции. Но в основе лежит одна и также возможность языка C#. Мы попробуем организовать динамическое обновление полей при помощи так называемых делегатов.

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

Создаём новую форму LWP04ChildrenDelegate1 со следующими элементами:

Рис. 6.1 Расстановка элементов на добавленной форме LWP04ChildrenDelegate1

Параметры формы LWP04ChildrenDelegate1 таковы:

(Name):

LWP04ChildrenDelegate1

Text:

Работа с окнами (C#):: Подчинённая форма для делегата № 1

Size:

500; 100

FormBorderStyle:

Fixed Dialog

MaximizeBox:

False

MinimizeBox:

False

ShowInTaskbar:

False

Рис. 6.1 Свойства формы LWP04ChildrenDelegate1: значения поля свойства ShowInTaskbar

Рис. 6.2 Свойства формы LWP04ChildrenDelegate1: значения поля свойства FormBorderStyle

Здесь также был использован новый элемент управления из коллекции элементов Label: обычный «текст» на форме:

Для элемента Label ключевым свойством является Text.

Параметры добавленного текстового поля редактирования таковы:

(Name):

TextBoxChildrenDelegate1

Событие TextChanged текстового поля редактирования TextBoxChildrenDelegate1:

private void TextBoxChildrenDelegate1_TextChanged(object sender, EventArgs e)

{

Text1 = TextBoxChildrenDelegate1.Text; // Присваиваем переменной обратной передачи значение текстового поля

}

Параметры добавленной кнопки Закрыть:

(Name):

ButtonClose

Text:

Закрыть

Size:

75; 23

Событие Click кнопки ButtonClose:

private void ButtonClose_Click(object sender, EventArgs e)

{

Close();

}

Для формы LWP04Main добавим Button:

Рис. 6.3 Расстановка элементов на добавленной форме LWP04Main: кнопка Для делегата № 1

Параметры добавленной кнопки таковы:

(Name):

ButtonShowChildrenDelegate1

Text:

Для делегата № 1

Size:

150; 23

ToolTip на Hint:

Передача параметра через метод в конструкторе

Событие Click кнопки ButtonShowChildrenDelegate1:

private void ButtonShowChildrenDelegate1_Click(object sender, EventArgs e)

{

/* Создаём экземпляр класса формы LWP04ChildrenDelegate1, вызывает конструктор

* Вместе с формой создаём экземпляр делегата с вызовом метода TextBoxNewDelegate1() */

LWP04ChildrenDelegate1 D1 = new LWP04ChildrenDelegate1(new NewDelegate1(TextBoxNewDelegate1));

D1.ShowDialog(); // Вызываем модальный диалог нашей формы

MessageBox.Show("Текст который был введён в форме:\n\n" + D1.Text1, D1.Text + ":: Результат выполнения"); // Возвращаем с формы переменную Text1 И показываем её в окошке MessageBox.Show

TextBoxMain.Text = D1.Text1; // Отправляем переменную в поле TextBoxMan

}

Ниже в этом же файле добавляем следующее:

string TextBoxNewDelegate1()

{

// Метод возвращает значение TextBoxMain, нужен для работы делегата

return TextBoxMain.Text;

}

В файле Program.cs ищем:

Application.Run(new LWP04Main());

}

}

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

public delegate string NewDelegate1(); // Создаём делегата № 1

Полный исходный код файла LWP04ChildrenDelegate1.cs (формы) с комментариями:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace LWP04WindowsForms03

{

public partial class LWP04ChildrenDelegate1: Form

{

private NewDelegate1 D1; // Объявляем экземпляр делегата NewDelegate1

public String Text1; // Объявляем переменную для передачи параметра обратно в главную форму

// Меняем конструктор формы, чтобы он мог узнать какой метод ему был отправлен...

public LWP04ChildrenDelegate1(NewDelegate1 sender)

{

InitializeComponent();

D1 = sender; //...и кем

}

private void ButtonClose_Click(object sender, EventArgs e)

{

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

}

private void LWP04ChildrenDelegate_Load(object sender, EventArgs e)

{

/* Вызываем созданный экземпляр класса NewDelegate1

* После вызова экземпляр вытаскивает из главной формы метод, а точнее переменную TextBoxNewDelegate1

* Далее делегат становится переменной, которую мы отправляем в TextBoxChildren этой формы

* Сама переменная делегата является возвращаемой строкой от TextBoxMain */

TextBoxChildrenDelegate1.Text = D1();

}

private void TextBoxChildren_TextChanged(object sender, EventArgs e)

{

Text1 = TextBoxChildrenDelegate1.Text; // Присваиваем переменной обратной передачи значение текстового поля

}

}

}

Компилируем приложение, проверяем работу текстовых полей второй добавленной формы и главной формы. При изменении текста в главной форме меняется значение в поле вызываемой формы (по нажатию кнопки Для делегата № 1). Изменений значения поля в вызванной форме приводит к обратному эффекту.

Рис. 6.4 Статическое изменение значений текстовых полей двух форм (до открытия и закрытия формы)

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

По аналогии с пунктом под номер 6 данной лабораторной работы создаём третью форму. Элементы расставляем также.

Создаём новую форму LWP04ChildrenDelegate1 со следующими элементами:

Рис. 7.1 Расстановка элементов на добавленной форме LWP04ChildrenDelegate1

Параметры формы LWP04ChildrenDelegate1 таковы:

(Name):

LWP04ChildrenDelegate1

Text:

Работа с окнами (C#):: Подчинённая форма для делегата № 2

Size:

500; 100

FormBorderStyle:

Fixed Dialog

MaximizeBox:

False

MinimizeBox:

False

ShowInTaskbar:

False

Параметры добавленного текстового поля редактирования таковы:

(Name):

TextBoxChildrenDelegate2

Событие TextChanged текстового поля редактирования TextBoxChildrenDelegate2:

private void TextBoxChildrenDelegate2_TextChanged(object sender, EventArgs e)

{

Text2 = TextBoxChildrenDelegate1.Text; // Присваиваем переменной обратной передачи значение текстового поля

}

Параметры добавленной кнопки Закрыть:

(Name):

ButtonClose

Text:

Закрыть

Size:

75; 23

Событие Click кнопки ButtonClose:

private void ButtonClose_Click(object sender, EventArgs e)

{

Close();

}

Также, добавим ещё одну кнопку для формы LWP04Main:

Рис. 7.2 Расстановка элементов на добавленной форме LWP04Main: кнопка Для делегата № 2

Параметры добавленной кнопки таковы:

(Name):

ButtonShowChildrenDelegate2

Text:

Для делегата № 2

Size:

150; 23

ToolTip на Hint:

Передача параметра через класс делегата

Событие Click кнопки ButtonShowChildrenDelegate2:

/* Создаём экземпляр класса формы LWP04ChildrenDelegate2, вызываем конструктор

* Вместе с формой создаём экземпляр делегата с вызовом метода TextBoxNewDelegate2() */

LWP04ChildrenDelegate2 D2 = new LWP04ChildrenDelegate2(new NewDelegate2In(TextBoxNewDelegate2));

D2.ShowDialog(); // Вызываем модальный диалог нашей формы

Это событие на кнопке аналогично тому, что уже было использовано. Мы совместим возможности показанные в пункте № 6 с новой функциональностью.

В этом же файле (LWP04Main.cs) добавляем следующее (новая функция void, и копия метода и пункта №6):

void TextBoxNewDelegate2Out(String Text)

{

/* Основной обработчик передачи параметра, вызывается всякий раз когда происходит событий обновления текста поле дочерней формы

* Вызывает MessageBox.Show с главной формы, что важно, сообщая параметр с дочерней формы */

MessageBox.Show("Текст который был введён в форме:\n\n" + Text, D2.Text + ":: Результат выполнения");

TextBoxMain.Text = Text; // Отправляем полученную переменную в поле TextBoxMan (выполняется динамически)

}

string TextBoxNewDelegate2()

{

// Метод возвращает значение TextBoxMain, нужен для работы делегата

return TextBoxMain.Text;

}

Основной метод главной формы отредактируем так (ВАЖНО, чтобы весь код находился после строчки (InitializeComponent();), так как здесь должен сработать сначала конструктор, а затем всё остальное.

public LWP04Main()

{

InitializeComponent();

NewDelegate2Out.EventHandler = new NewDelegate2Out.NewEventOut(TextBoxNewDelegate2Out);

}

Ключевым же является метод дочерней формы для текстового поля редактирования. Событие TextChanged текстового поля редактирования TextBoxChildrenDelegate2:

// Метод отлавливающий изменения текстового поля является здесь основным

private void TextBoxChildrenDelegate2_TextChanged(object sender, EventArgs e)

{

/* Срабатывает делегат NewDelegate2Out при получения события изменений текста этого поля

* и в метод (на главную форму) отправляется значение этого поля

* То есть изменение текста приводит к ВЫЗОВУ события EventHandler и отправку через делегат данных текстового поля */

NewDelegate2Out.EventHandler(TextBoxChildrenDelegate2.Text);

}

Сам класс делегата в файле Program.cs реализован так:

/* Создаём делегата № 2 */

public static class NewDelegate2Out

{

public delegate void NewEventOut(String Data);

public static NewEventOut EventHandler;

}

// Делаем по аналогии

public delegate string NewDelegate2In();

Последний способ достаточно сложен для понимания. В основе лежит инициализация EventHandler. Он представляет метод, который будет обрабатывать событие, не имеющее данных. Поэтому, он «ловит» событие изменение текса, узнаёт кто (какой элемент) проинициализировал это событие и вытаскивает текст в текстовом поле редактирования дочерней формы. Итак, что же такое делегаты?

В платформе.NET Framework в основе модели события лежит существование делегата события, связывающего событие с его обработчиком. Для вызова события требуются два элемента:

1. делегат, который идентифицирует метод, вызываемый в ответ на событие (делегат был создан);

2. класс, в котором хранятся данные события (мы организовывали в как раз таки класс).

Делегат -- это тип, который определяет сигнатуру, иными словами тип возвращаемого значения, и тип списка параметров метода. Тип делегата можно использовать для объявления переменной, которая может ссылаться на любой метод с той же сигнатурой, что и у делегата.

В стандартной сигнатуре делегата обработчика событий определяется не возвращающий значение метод, первый параметр которого относится к типу Object и ссылается на экземпляр, который инициировал событие, а второй параметр является производным от типа EventArgs и содержит данные события. Если событие не создает данных, второй параметр просто является экземпляром класса EventArgs. В противном случае, второй параметр является пользовательским типом, производным от EventArgs, и предоставляет всевозможные поля и свойства, необходимые для хранения данных события (что мы и получили, считав текст с поля).

EventHandler является предопределённым делегатом, представляющим метод обработчика событий для события, не генерирующего данные. Если событие не генерирует данные, необходимо предоставить собственный пользовательский тип данных события и либо создать делегат, в котором типом второго параметра является этот пользовательский тип, либо использовать универсальный класс делегата EventHandler(Of TEventArgs) и подставлять свой пользовательский тип в параметр универсального типа. Чтобы связать событие с методом, который будет обрабатывать событие, и добавить в событие экземпляр делегата. Обработчик событий вызывается при каждом происхождении этого события, пока делегат не будет удален.

Именно событийная модель делает делегаты мощным инструментом (что можно было увидеть при выполнении данной лабораторной работы).

Немного об объявлении делегата в общем виде: объявление создания делегата происходит так:

delegate void MyDelegate();

Сначала идёт ключевое слово, затем возвращаем тип метода (void), и потом имя делегата. В нашем случае, делегат не возвращает зачения и не получает параметров, то есть это относится к любому методу этого делегата.

Используя конструктор, создаём новый объект нашего типа-делегата:

MyDelegate NewDelegate = new MyDelegate(MyMethod);

Мы видим, что в конструктор передалось имя целевого метода. Тип этого метода должен быть обязательно void (раз мы решили так сделать в самом начале). И конструктором создаётся экземпляр под именем NewDelegate.

Целевой метод:

static void MyMethod()

{

/* Тут может быть какой-либо код */

}

Для запуска делегата вызываем объект нашего делегата (будет выполнен метод MyMethod()):

NewDelegate();

Компилируем приложение, проверяем работу текстовых полей третьей добавленной формы и главной формы. При изменении текста в главной форме меняется значение в поле вызываемой формы (по нажатию кнопки Для делегата № 2). Изменение значения поля в вызванной форме приводит к обратному эффекту, а также вызову MessageBox.

Рис. 7.3 Динамическое изменение значений текстового полей главной формы (во время ввода данных в текстовом поле дочерней формы)

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 Всплывающее окошко без части заголовка

9. Завершающая часть

Компилируем приложение (Release) и запускаем. Результат работы показан ниже (Рис. 9. 1):

Рис. 9.1 Модифицированное приложение Windows Forms

10. О приложении к Лабораторной работе № 4

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

Приложение: Исходный код программы и всех сопровождающих файлов с кодом приведён по ссылке в конце этого материала.

Размещено на Allbest.ru

...

Подобные документы

  • Общие положения по программированию в интерфейсе Windows Forms. Среда разработки MicrosoftVisualStudio, ее главные особенности и характеристика. Создание эмулятора пункта меню Microsoft Office Word "Формат-Шрифт" с использованием интерфейса Windows Forms.

    курсовая работа [3,4 M], добавлен 26.01.2013

  • Устройство и характеристики СУБД SQLite. Методы работы с базой данных. Описание PIPE под Windows. Разработка API взаимодействия клиентских приложений с сервером СУБД через Pipe под Windows. Шифрование и модификация передающейся через канал информации.

    курсовая работа [600,0 K], добавлен 04.05.2014

  • Разработка программного приложения Windows Forms для работы с базой данных на языке высокого уровня в автономном режиме с использованием ADO.NET. Создание консольных приложений (варианты метода Main), выполнение запросов к SQL серверу и листинг программ.

    курсовая работа [2,4 M], добавлен 16.06.2014

  • Описание платформы NET Framework. База данных Microsoft Access. Разработка Windows приложения. Модель программирования Windows Forms. Функциональное назначение программы. Входные и выходные данные. Требования к техническому и программному обеспечению.

    курсовая работа [2,2 M], добавлен 15.03.2015

  • Обеспечение безопасности сайта; значение правильной обработки данных, получаемых из формы. Вызов и условное объявление функции. Передача параметров по значению и ссылке. Обработка HTML-форм; протокол GET. Доступ к полям формы через ассоциированный массив.

    презентация [112,7 K], добавлен 21.06.2014

  • Проектирование службы Windows и приложения для управления этой службой, которое позволит контролировать данные приложения - запускать и завершать определенные процессы по желанию пользователя через определенные промежутки времени. Инструкция по установке.

    курсовая работа [2,8 M], добавлен 05.01.2013

  • Сведения об окружности, ее радиус и площадь. Разработка программы для вычисления площади круга и длины окружности по заданному радиусу с использованием Windows.Forms-приложений. Пошаговая инструкция; описание главного окна, код, примеры работы программы.

    курсовая работа [818,6 K], добавлен 14.09.2014

  • Основы организации приложения в Windows. Посылка и передача сообщений для окон. Создание и отображение главного окна приложения. Деактивация приложения, его фазы. Сообщения клавиатуры и функции для работы с ней. Определение состояния отдельных клавиш.

    лекция [65,7 K], добавлен 24.06.2009

  • Просмотр, запись и чтение данных буфера обмена. Динамический обмен данными (DDE), способы его организации. Атомы в Windows, их понятие и функции. Особенности задания параметра lParam сообщений DDE. Обмен и передача данных между клиентом и сервером.

    лекция [303,7 K], добавлен 24.06.2009

  • Понятие, типы и работа брандмауэра. Встроенные в Windows firewall. Windows XP SP2, доступ к настройкам файрвола Windows XP Service Pack 2. Windows Vista, разрешенный трафик. Windows 7, настройки активных профилей. Персоальные Firewall, уровни тестов.

    реферат [3,8 M], добавлен 19.11.2010

  • Характеристика операционной системы. История развития Windows. Сравнительная характеристика версий Windows. Элементы и инструменты Windows XP. Прикладные программы в Windows XP. Работа настольных и портативных компьютеров под управлением Windows.

    доклад [19,1 K], добавлен 16.10.2011

  • Реализация программы, созданной средствами языка C#. Предназначение Windows-приложения для решения комплекса задач. Определение состава форм с графиком функции. Вычисление коэффициентов полинома. Создание текстового поля для введения корней многочлена.

    курсовая работа [234,8 K], добавлен 13.11.2016

  • Операционная система офисной сети, преимущества и недостатки. Реализация офисной сети под управлением операционной системы Windows Server 2003: сетевые свойства, средства удаленного доступа, соединение локальных сетей через Интернет, организация защиты.

    дипломная работа [1,4 M], добавлен 08.06.2011

  • Реализация информационно-справочной системы "Отдел кадров" на языке программирования, с использованием технологии сериализации объектов. Средства конструктора баз данных Windows Forms. Обработка информации и соответствующие организационные ресурсы.

    отчет по практике [95,7 K], добавлен 09.08.2015

  • Создание приложения Windows Forms в среде Microsoft Visual Studio 2008. Разработка программы "Курсовой" для организации работы по учёту курсовых работ в учебных заведениях с возможностью добавления, удаления, редактирования и поиска информации.

    курсовая работа [2,2 M], добавлен 28.06.2011

  • Разработка проекта с помощью встроенных средств языка C#, на базе сетевого стека и сетевых функций Windows. Специфика создания удобного интерфейса программы с использованием Windows Forms, которая способна пересылать данные на удалённый компьютер.

    курсовая работа [162,6 K], добавлен 16.06.2013

  • Разработка API взаимодействия клиентских приложений с сервером СУБД через Pipe под Windows. Устройство и характеристики СУБД SQLite. Методы WinAPI для передачи данных. Реализация взаимодействия через PIPE. Результат работы серверного приложения.

    курсовая работа [596,3 K], добавлен 09.05.2014

  • История создания. Windows 9x/NT. Операционная система Microsoft Windows. Преимущества и недостатки Windows. Некоторые клавиатурные комбинации Windows 9x и NT. Windows XP Professional. Наиболее совершенная защита.

    реферат [19,3 K], добавлен 18.07.2004

  • История ОС семейства Windows. Основные принципы администрирования ОС. Создание домашней группы. Присоединение к домашней группе или ее создание. Особенности ОС Windows 7. Анализ уязвимостей Microsoft Windows 7. Особенности версий ОС Windows 7.

    курсовая работа [2,2 M], добавлен 13.12.2010

  • Windows Management Instrumentation как инструментарий управления Windows, его общая характеристика и возможности, функциональные особенности. Классы, события и безопасность WMI. Работа с объектами и коллекциями объектов, полученными в результате запросов.

    курсовая работа [428,8 K], добавлен 26.04.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.