Разработка Windows-приложений на языке C# 2005

Создание элементов управления

Разбить на страницы
Показывать лекцию целиком

Цель работы: Изучить основные элементы управления Windows -форм, их свойства и методы, а также получить практические навыки в разработке Windows -форм с элементами контроля

Общие сведения

Классы, представляющие графические элементы управления, находятся в пространстве имен System.Windows.Forms. С их помощью обеспечивается реакция на действия пользователя в приложении Windows Forms. Классы элементов управления связаны между собой достаточно сложными отношениями наследования. Общая схема таких отношений представлена на рисунке 7.1.

Класс Control, как общий предок, обеспечивает все производные классы общим набором важнейших возможностей. В числе этих возможностей можно перечислить события мыши и клавиатуры, физические размеры и местонахождение элемента управления (свойства Height, Width, Left, Right, Location ), установку цвета фона и цвета переднего плана, выбор шрифта и т.п.

При создании приложения можно добавить элементы управления на форму при помощи графических средств Visual Studio. Обычно достаточно выбрать нужный элемент управления в окне ToolBox и поместить его на форме. Visual Studio автоматически сгенерирует нужный код для формы. После этого можно изменить название элемента управления на более содержательное (например, вместо button1, предлагаемого по умолчанию, - buttonPrimer ) Visual Studio позволяет не только размещать на форме элементы управления, но и настраивать их свойства. Для этого достаточно щелкнуть на элементе управления правой кнопкой мыши и в контекстном меню выбрать Properties (Свойства).

(рис 7.1) Иерархия элементов управления Windows Forms

Все изменения, которые необходимо произвести в открывшемся окне (рисунок 7.2), будут добавлены в код метода InitializeComponents().

То же самое окно позволяет настроить не только свойства данного элемента управления, но и обработку событий этого элемента. Перейти в список событий можно при помощи кнопки(рис 7.2) в закладке Properties (рисунок 7.3). Можно выбрать в списке нужное событие и рядом с ним сделать двойной щелчок или ввести имя метода или выбрать метод из списка.

(рис 7.3) Настройка обработчиков событий

После задания имени метода или двойного щелчка Visual Studio сгенерирует заготовку для обработчика события.

Рассмотрим основные элементы управления Windows -форм.

Элемент управления TextBox

Элемент управления TextBox (текстовое окно) предназначен для хранения текста (одной или нескольких строк). При желании текст в TextBox может быть настроен как "только для чтения", а в правой и нижней части можно поместить полосы прокрутки.

Класс TextBox происходит непосредственно от класса TextBoxBase, обеспечивает общими возможностями как TextBox, так и RichTextBox. Свойства, определенные в TextBoxBase, представлены в таблице 7.1.

Свойства TextBoxBase
Свойство Назначение
AcceptsTab Определяет, что будет производиться при нажатии на клавишу Tab: вставка символа табуляции в само поле или переход к другому элементу управления
AutoSize Определяет, будет ли элемент управления автоматически изменять размер при изменении шрифта на нем
BackColor, ForeColor Позволяют получить или установить значение цвета фона и переднего плана
HideSelection Позволяет получить или установить значение, определяющее, будет ли текст в TextBox оставаться выделенным после того, как этот элемент управления будет выведен из фокуса
MaxLength Определяет максимальное количество символов, которое можно будет ввести в TextBox
Modified Позволяет получить или установить значение, определяющее, был ли текст в TextBox изменен пользователем
Multiline Указывает, может ли TextBox содержать несколько строк текста
Readonly Помечает TextBox как "только для чтения"
SelectedText, SelectionLength Содержат выделенный текст (или определенное количество символов) в TextBox
SelectionStart Позволяет получить начало выделенного текста в TextBox
Wordwrap Определяет, будет ли текст в TextBox автоматически переноситься на новую строку при достижении предельной длины строки

В TextBoxBase также определено множество методов: для работы с буфером обмена ( Cut, Copy и Paste ), отменой ввода ( Undo ) и прочими возможностями редактирования ( Clear, AppendText и т. п.).

Из всех событий, определенных в TextBoxBase, наибольший интерес представляет событие TextChange. Это событие происходит при изменении текста в объекте класса, производном от TextBoxBase. Например, его можно использовать для проверки допустимости вводимых пользователем символов (например, предположим, что пользователь должен вводить в поле только цифры или, наоборот, только буквы).

Свойства, унаследованные от Control и от TextBoxBase, определяют большую часть возможностей TextBox. Свойств, определенных непосредственно в классе TextBox, не так уж и много. Они представлены в таблице 7.2.

Свойства, определенные в классе TextBox
Свойство Назначение
AcceptsReturn Позволяет определить, что происходит, когда пользователь при вводе текста нажал на Enter. Варианта два: либо в TextBox начинается новая строка текста, либо активизируется кнопка по умолчанию на форме
CharacterCasing Позволяет получить или установить значение, определяющее, будет ли изменяться регистр вводимых пользователем символов
PasswordChar Позволяет выбрать символ, используемый для отображения вводимых пользователем данных (в поле для ввода пароля)
ScrollBars Позволяет получить или установить значение, определяющее, будут ли в TextBox с несколькими строками присутствовать полосы прокрутки
TextAlign Позволяет определить выравнивание текста в TextBox (используются значения из перечисления HorizontalAlignment )

Значения перечисления HorizontalAlignment представлены в таблице 7.3.

Значения перечисления HorizontalAlignment
Значение Описание
Center Выравнивание по центру
Left Выравнивание по левому краю
Right Выравнивание по правому краю

Класс Button

Кнопка ( button ) - это самый простой из всех элементов управления и при этом наиболее часто используемый. Можно сказать, что кнопка - это возможность принять ввод (щелчок кнопкой мыши или набор на клавиатуре) наиболее простым способом. Непосредственный предок класса System.Windows.FormButton в иерархии классов .NET - это класс ButtonBase, обеспечивающий общие возможности для целой группы производных от него элементов управления (таких как Button, CheckBox и RadioButton ). Некоторые свойства ButtonBase представлены в таблице 7.4.

Свойства ButtonBase
Свойство Назначение
FlatStyle Позволяет настроить "рельефность" кнопки. Используются значения из перечисления FlatStyle
Image Позволяет задать изображение, которое будет выводиться на кнопке (при этом можно указать точное местонахождение изображения). Фоновый рисунок лучше настраивать при помощи свойства BackgroundImage, определенного в базовом классе Control
ImageAlign Позволяет определить выравнивание изображения, размещенного на кнопке. Используются значения из перечисления ContentAlignment
Imagelndex, ImageList Эти свойства используются для работы с набором изображений (объектом ImageList ), выводимых на кнопке
IsDefault Определяет, будет ли эта кнопка являться кнопкой по умолчанию (то есть срабатывать при нажатии на Enter )
TextAlign Позволяет получить или установить выравнивание текста на кнопке. Также используются значения из перечисления ContentAlignment

Сам класс Button не определяет каких-либо дополнительных возможностей помимо унаследованных от ButtonBase, за единственным, но существенным исключением свойства DialogResult. Это свойство позволяет возвращать значение при закрытии диалогового окна, например, при нажатии кнопок ОК или Cancel (Отменить).

В подавляющем большинстве случаев выравнивание текста, размещенного на кнопке, производится по центру, так что текст будет размещен строго посередине кнопки. Однако если нам по каким-то причинам необходимо использовать другой стиль выравнивания, в нашем распоряжении - свойство TextAlign, определенное в классе ButtonBase. Для TextAlign используются значения из перечисления ContentAlignment (таблица 7.5). Значения из того же перечисления используются и для определения положения изображения на кнопке.

Значения перечисления ContentAlignment
Значение Описание (выравнивание)
BottomCenter По нижнему краю кнопки, относительно боковых краев - посередине
BottomLeft Но нижнему краю кнопки, слева
BottomRight По нижнему краю кнопки, справа
MiddleCenter По центру кнопки
MiddleLeft Относительно верхнего и нижнего краев - по центру, относительно боковых краев - слева
MiddleRight Относительно верхнего и нижнего краев - по центру, относительно боковых краев - справа
TopCenter По верхнему краю кнопки, относительно боковых краев - посередине
TopLeft По верхнему краю кнопки, слева
TopRight По верхнему краю кнопки, справа

Флажки

Для флажка (тип CheckBox ) предусмотрено три возможных состояния. Как и тип Button, CheckBox наследует большую часть своих возможностей от базовых классов Control и ButtonBase. Однако в этом классе существуют и свои собственные члены, обеспечивающие дополнительные уникальные возможности. Наиболее важные свойства CheckBox представлены в таблице 7.6.

Свойства класса CheckBox
Свойство Назначение
Appearance Настраивает вид флажка. Для этого свойства используются значения из перечисления Appearance
AutoCheck Позволяет получить или установить значение, определяющее, будут ли значения Checked и CheckState, а также внешний вид флажка автоматически изменяться при щелчке на нем
CheckAlign Позволяет установить горизонтальное и вертикальное выравнивание собственно флажка (квадратика) в элементе управления CheckBox. Используются значения из перечисления ContentAlignment
Checked Возвращает значение типа bool, представляющее текущее состояние флажка (выбран или не выбран) Если для свойства ThreeState установлено значение true, то свойство Checked будет возвращать true как для явно выбранного флажка, так и для того флажка, для которого установлено значение "не определено" ( indeterminate )
CheckState Позволяет получить или установить значение флажка (установлен - не установлен - не определено), используя не true и false, как в Checked, а три значения из перечисления CheckState. Обычно используется, если свойство ThreeState для флажка имеет значение true (то есть он допускает три значения).
ThreeState Определяет, будут ли для флажка использоваться три значения (из перечисления CheckState ) или только два

Возможные состояния флажка ( Indeterminate можно использовать только тогда, когда для свойства ThreeState установлено значение true ) представлены в таблице 7.7.

Значения перечисления CheckState
Значение Описание
Checked Флажок установлен
Indeterminate Значение не определено (обычно флажок выглядит как "серый", затененный)
Unchecked Флажок снят

Состояние "значение не определено" ( indeterminate ) может быть установлено, например, для верхнего элемента иерархии, в которой для одной части подчиненных элементов флажок установлен, а для другой - снят.

Переключатели и группирующие рамки

Тип RadioButton (переключатель) можно воспринимать, как несколько видоизмененный флажок при этом сходство между этими типами подчеркивается почти полным совпадением наборов членов. Между типами RadioButton и CheckBox существуют лишь два важных различия: в RadioButton предусмотрено событие CheckedChanged (возникающее при изменении значения Checked ), а кроме того, RadioButton не поддерживает свойство ThreeState и не может принимать состояние Indeterminate (не определено).

Переключатели всегда используются в группах, которые рассматриваются как некое единое целое. Внутри группы переключателей одновременно может быть выбран только один переключатель. Для группировки переключателей в группы используется тип GroupBox.

И флажок ( CheckBox ), и переключатель ( RadioButton ) поддерживают свойство Checked, при помощи которого очень удобно получать информацию о состоянии соответственно флажка и переключателя. Однако если есть необходимость задействовать дополнительное третье состояние флажка (не определено - Indeterminate ), то придется вместо Checked использовать свойство CheckState и значения из одноименного перечисления CheckState.

Элемент управления CheckedListBox

Типы Button, CheckBox и RadioButton являются производными от ButtonBase, и их можно определить как некие разновидности кнопок. К членам семейства списков относятся CheckedListBox (список с флажками), ListBox (список) и ComboBox (комбинированный список).

Элемент управления CheckedListBox (список с флажками) позволяет помещать обычные флажки внутри поля с полосами прокрутки.

Кроме того, в элементе управления CheckedListBox предусмотрена возможность использования нескольких столбцов. Для этого достаточно установить значение true для свойства MultiColumn.

CheckedListBox наследует большинство своих возможностей от типа ListBox. To же самое справедливо и в отношении класса ComboBox. Наиболее важные свойства System.Windows.Forms.ListBox представлены в таблице 7.8.

Свойства класса ListBox
Свойство Назначение
ScrollAlwaysVisible Определяет, будет ли полоса прокрутки выводиться всегда
Selectedlndex Индекс выделенного в настоящий момент элемента в списке (если такой имеется). Если ни один элемент не выделен, то возвращается значение -1
SelectedIndices Набор индексов выделенных в настоящий момент элементов в списке. Если не выделен ни один элемент, то возвращается пустой набор
SelectedItem Значение выделенного в настоящий момент элемента. Если ни один из элементов не выделен, то возвращается null
SelectedItems Возвращает коллекцию значений выделенных элементов (для списков, в которых допускается выбор нескольких значений)
SelectionMode Определяет число элементов, которые возможно выбрать в списке одновременно. Для этого свойства используются значения из перечисления SelectionMode
Sorted Определяет, будут ли элементы в списке упорядочены (по алфавиту) или нет
TopIndex Возвращает индекс первого видимого элемента в списке

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

Комбинированные списки

Как и списки (объекты ListBox ), комбинированные списки (объекты ComboBox ) позволяют пользователю производить выбор из списка заранее определенных элементов. Однако у комбинированных списков есть одно существенное отличие от обычных: пользователь может не только выбрать готовое значение из списка, но и ввести свое собственное. Класс ComboBox наследует большинство своих возможностей от класса ListBox (который, в свою очередь, является производным от Control ), однако в нем предусмотрены и собственные важные свойства, представленные в таблице 7.9.

Свойства ComboBox
Свойство Назначение
DroppedDown "Раскрывающийся вниз": определяет, будет ли список ниспадающим
MaxDropDownltems Определяет максимальное количество элементов, которое будет показано в нижней части ниспадающего списка. Допустимые значения - от 1 до 100
MaxLength Определяет максимальную длину текста, который пользователь может ввести в ComboBox
Selectedlndex Определяет индекс выделенного элемента ComboBox. Если ни один элемент не выделен, возвращается значение -1
Selectedltem Возвращает ссылку на объект выделенного элемента ComboBox
SelectedText Возвращает выделенный текст в поле редактирования ComboBox
SelectionLength Определяет длину (в символах) выделенного текста в поле редактирования ComboBox
Style Позволяет получить или установить стиль ComboBox. Для этого свойства используются значения из перечисления ComboBoxStyle
Text Позволяет получить доступ к тексту в поле редактирования. При работе с ComboBox это унаследованное свойство используется чаще всех остальных

Стиль для ComboBox можно настроить при помощи свойства Style, для которого используются значения из перечисления ComboBoxStyle (таблица 7.10).

Значения перечисления ComboBoxStyle
Значение Описание
DropDown Пользователь может вводить значения в поле редактирования. Для отображения списка пользователь должен нажать на кнопку со стрелкой, направленной вниз ( Arrow Button )
DropDownList Пользователь не может вводить значения в поле редактирования. Для отображения списка пользователь должен нажать на кнопку со стрелкой, направленной вниз ( Arrow Button )
Simple Пользователь может вводить значения в поле редактирования. Список значений виден всегда

Порядок перехода по Tab

Если на форме размещено несколько элементов управления, то пользователи обычно ожидают, что между ними можно будет перемещаться с помощью клавиши Tab. Часто бывает необходимо после размещения элементов управления настроить порядок перехода между ними. Для этого используются два свойства (унаследованные от базового класса Control и поэтому общие для всех элементов управления): TabStop и Tablndex. Для свойства TabStop используются только два значения: true и false. Если для TabStop установлено значение true, то к этому элементу управления можно будет добраться с помощью клавиши Tab. Если же установлено значение false, то участвовать в переходах по Tab этот элемент управления не будет. Если элемент управления TabStop имеет значение true, то очередность перехода можно настроить с помощью свойства Tablndex:

В Visual Studio.NET предусмотрено средство, при помощи которого можно быстро настроить порядок перехода для элементов управления на форме. Это средство называется Tab Order Wizard и оно доступно из меню View (View > Tab Order). Чтобы изменить значения TabIndex для каждого элемента управления, достаточно просто щелкать мышью на элементах управления в выбранном нами порядке перехода. Для элементов управления, помещенных в группирующую рамку, Tab Order Wizard создает отдельную последовательность перехода.

Элемент управления MonthCalendar

В пространстве имен System.Windows.Forms предусмотрен элемент управления, при помощи которого пользователь может выбрать дату или диапазон дат, используя дружественный и удобный интерфейс. Это элемент управления MonthCalendar.

Наиболее важные свойства MonthCalendar представлены в табл. 7.11.

Свойства MonthCalendar
Свойство Назначение
BoldedDates Массив объектов DateTime, выделенных подсветкой
CalendarDimensions Определяет количество выводимых строк и столбцов
FirstDayOfWeek Определяет, с какого дня будет начинаться неделя в MonthCalendar
MaxDate Самая поздняя дата, которую разрешается выбрать пользователю (по умолчанию ограничений нет)
MaxSelectionCount Максимальное количество дат, которое одновременно может выбрать пользователь
MinDate Самая ранняя дата, которую разрешается выбрать пользователю (по умолчанию ограничений нет)
MonthlyBoldedDates Массив выделенных подсветкой объектов DateTime для месяца
SelectionRange Диапазон выделенных объектов
SelectionEnd Самая поздняя дата в диапазоне выделенных объектов
SelectionStart Самая ранняя дата в диапазоне выделенных объектов
ShowToday Определяет, будет ли MonthCalendar выводить информацию о текущей дате
ShowTodayCircle Определяет, будет ли MonthCalendar выводить информацию о текущей дате в нижней части и выделять ее в календаре обводкой
ShowWeekNumbers Определяет, будет ли MonthCalendar отображать номера недель справа от каждой строки
TodayDate Дата, которая будет считаться MonthCalendar сегодняшней. По умолчанию TodayDate - это системная дата на момент создания объекта MonthCalendar
TodayDateSet Определяет, можно ли пользователю по своему усмотрению выбирать сегодняшнюю дату. Если для этого свойства установлено значение true, пользователь может выбрать в качестве сегодняшней ( TodayDate ) любое число

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

Можно получить дату, выбранную пользователем в MonthCalendar, при помощи свойства SelectionStart. Это свойство возвращает ссылку на объект DateTime, которая хранится в специальной переменной ( d ) При помощи набора свойств типа DateTime можно извлечь всю необходимую информацию в нужном нам формате.

При помощи свойств Month, Day и Year можно извлечь из объектов DateTime нужную информацию и сформировали текстовые строки. Это вполне допустимый подход. Дело в том, что дату в необходимом текстовом формате проще получить из DateTime при помощи специальных "форматирующих" свойств самих объектов DateTime. Набор таких свойств (и некоторые методы) представлен в таблице 7.12.

Члены класса DateTime
Член Назначение
Date Позволяет получить информацию о дате (дата всегда отсчитывается от полуночи)
Day, Month, Year Позволяют получить соответственно день, месяц и число из текущего объекта DateTime
DayOfWeek Возвращает день недели для объекта DateTime
DayOfYear Возвращает номер дня в году для объекта DateTime
Hour, Minute, Second, Millisecond Возвращают информацию о часе, минутах, секундах и миллисекундах для объекта DateTime
MaxValue, MinValue Возвращают минимальное и максимальное значения для DateTime
Now, Today Эти два статических свойства типа DateTime позволяют получить информацию о текущей дате и времени ( Now ) или только о текущей дате ( Today )
Ticks Позволяет получить счетчик "тиков" (с интервалом в 100 наносекунд) для объекта DateTime
ToLongDateString( ), ToLongTimeString( ), ToShortDateString( ), ToShortTimeString( ) Преобразуют текущее значение объекта DateTime в разные виды текстового представления

При помощи вышеперечисленных членов можно значительно упростить вывод текстовой информации о дате.

Элемент управления Panel

Назначение элемента управления Panel (панель) - с его помощью можно объединить прочие элементы управления на форме. Panel происходит от базового класса ScrollableControl и поддерживает полосы прокрутки.

Элементы управления Panel обычно используются для экономии пространства на форме. Например, если элементы управления, которые планируем разместить на форме, на ней не умещаются, то можно поместить их внутрь Panel и установить для свойства AutoScrol1 объекта Panel значение true. В результате пользователь получит возможность доступа к "не вмещающимся" элементам управления с помощью полос прокрутки.

Всплывающие подсказки (ToolTips)

Большинство приложений с современным пользовательским интерфейсом поддерживают всплывающие подсказки. В приложениях .NET эта возможность реализуется при помощи типа System.Windows.Forms.ToolTip. ToolTip (всплывающие подсказки) - это небольшие окна с текстом, появляющиеся при наведении указателя мыши на элемент управления на форме. Наиболее важные члены класса ToolTip представлены в таблице 7.13.

Члены класса ToolTip
Член Назначение
Active Определяет, будет ли всплывающая подсказка активной. Возможность отключить всплывающие подсказки может быть полезной, например, если в приложении предусмотрено два варианта интерфейса: для обычных и для опытных пользователей
AutomaticDelay Позволяет получить или установить время задержки (в миллисекундах) при появлении подсказки
AutoPopDelay Время (в миллисекундах), в течение которого подсказка остается видимой, если указатель мыши неподвижен и находится в области, занимаемой соответствующим элементом управления. По умолчанию это значение равно 10 значениям AutomaticDelay
GetTooltip( ) Возвращает текст подсказки
InitialDelay Время (в миллисекундах), в течение которого указатель должен оставаться неподвижным в соответствующей области для появления подсказки. Значение по умолчанию равно значению AutomaticDelay
ReshowDelay Время (в миллисекундах), в течение которого появится другая подсказка при перемещении указателя мыши от одного элемента управления к другому. По умолчанию это значение равно 1/5 от значения AutomaicDelay
SetToolTip( ) Ассоциирует подсказку с элементом управления

Для того чтобы настроить использование всплывающих подсказок для элементов управления можно сделать это с помощью графических средств Visual Studio.

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

Проектирование элементов управления формы FormEmployee

Для разработки проекта приложения форма FormEmployee должна содержать элементы управления, в соответствии с видом, приведенном на рисунке 7.4 .

(рис 7.4) Вид экранной формы FormEmployee

На данной форме необходимо сформировать элементы управления, приведенные в таблице 7.14.

Элементы управления формы FormEmployee
Элемент контроля Имя Свойство Text/Items Назначение
SplitContainer splitContainerEmployee Две панели с разделителем
Label labelListEmployee Список сотрудников Надпись
listBox listBoxEmployee Список сотрудников
Label labelSurname Фамилия Надпись
Label labelName Имя Надпись
Label labelPatronymic Отчество Надпись
Label labelJobRole Должность Надпись
Label labelStatus Статус Надпись
Label labelAccess Уровень доступа Надпись
label labelNetName Сетевое имя Надпись
textBox textBoxNetName Сетевое имя
textBox textBoxSurname Фамилия
textBox textBoxName Имя
textBox textBoxPatronymic Отчество
comboBox comboBoxJobRole Должность
comboBox comboBoxStatus Активен, выходной, в отпуске, болеет, не работает, помечен как удаленный Статус
comboBox comboBoxAccess Оператор, старший оператор, начальник смены, администратор, аналитик Уровень доступа
menuItem menuItemAction Действие Пункт меню "Редактировать"
menuItem menuItemUndo Отменить Подпункт меню "Отменить"
menuItem menuItemNew Создать Подпункт меню "Новый"
menuItem menuItemEdit Изменить Подпункт меню "Изменить"
menuItem menuItemSave Сохранить Подпункт меню "Сохранить"
menuItem menuItem Удалить Подпункт меню "Удалить"
menuItem menuItemReport Отчет Пункт меню "Отчет"
menuItem menuItemReport1 По сотруднику Подпункт меню "Отчет по сотруднику"
menuItem menuItemReport2 По всем сотрудникам Подпункт меню "Отчет по всем сотрудникам"

Вначале создайте на форме элемент SplitContainer (рисунок 7.5). На панели 1 создайте элементы управления labelListEmployee и listBoxEmployee (рисунок 7.6), а остальные элементы управления, приведенные в таблице 7.14, - на панели 2 (рисунок 7.4).

После создания на форме FormEmployee элементов управления в соответствии с таблицей 7.14 необходимо настроить порядок перехода между ними при нажатии клавиши Tab.

(рис 7.6) Создание панелей на форме FormEmployee(рис 7.5) Формирование элементов управления на панели 1 формы FormEmployee

Для этого необходимо задать последовательные номера свойству TabIndex элементов управления (в разрабатываемой форме это необходимо сделать для элементов управления TextBox и ComboBox ) из окна Properties (рисунок 7.7) или вызвать мастер Tab Order Wizard из меню View/Tab Order (рисунок 7.8). Задание последовательности значений свойству TabIndex производится щелчком мыши на элементах управления в заданной последовательности.

(рис 7.8) Задание свойства TabIndex для элемента контроля(рис 7.7) Настройка перехода по элементам управления

Результат настройки порядка перехода между элементами управления при нажатии клавиши Tab приведен на рисунке 7.9.

Для работы с формой необходимо создать методы, которые разрешают только просматривать форму (режим просмотра) и редактировать форму (режим редактирования).

(рис 7.9) Результат работы мастера Tab Order Wizard

Создадим метод для задания режима просмотра формы DisplayReadOnly. Метод DisplayReadOnly должен быть общедоступным, ничего не должен возвращать и не иметь параметров. Для задания режима просмотра (только для чтения) объекту класса TextBox необходимо свойству ReadOnly присвоить значение true, а для объекта класса comboBox - свойству Enabled значение false. Код метода DisplayReadOnly представлен далее:

public void DisplayReadOnly()
{
    this.textBoxSurname.ReadOnly = true;
    this.textBoxName.ReadOnly = true;
    this.textBoxPatronymic.ReadOnly = true;
    this.textBoxNetName.ReadOnly = true;
    this.comboBoxJobRole.Enabled = false;
    this.comboBoxStatus.Enabled = false;
    this.comboBoxAccess.Enabled = false;
}

Аналогичным образом сформируем метод DisplayEdit, который задает режим редактирования формы:

/// Задание режима редактирования
public void DisplayEdit()
{
    this.textBoxSurname.ReadOnly = false;
    this.textBoxName.ReadOnly = false;
    this.textBoxPatronymic.ReadOnly = false;
    this.textBoxNetName.ReadOnly = false;
    this.comboBoxJobRole.Enabled = true;
    this.comboBoxStatus.Enabled = true;
    this.comboBoxAccess.Enabled = true;
}

Для управления режимом доступности (только для чтения/редактирование) формы FormEmployee необходимо метод DisplayReadOnly вызывать при первоначальной загрузке формы (событие Load ), при создании новых данных по сотруднику и при редактировании данных по сотруднику, а метод DisplayEdit - при сохранении данных по сотруднику и при отмене режима редактирования данных.

Проверьте правильность режима управления доступностью элементов управления формы FormEmployee.

Анализ кодов методов DisplayReadOnly( ) и DisplayEdit( ) показывает, что они могут быть объединены в один метод с параметром. Необходимо самостоятельно написать объединенный метод, получив в результате метод DisplayReadOnly(bool readOnly), в котором параматр readOnly определяет режим редактирования: если readOnly равен true, то режим только для просмотра, если равен false, то - редактирование.

В процессе работы приложения необходимо управлять доступом к пунктам меню в соответствии с диаграммой состояний для пунктов меню формы FormEmployee, приведенной на рисунке 7.10.

(рис 7.10) Диаграмма состояний для активности подпунктов меню "Действие"

Диаграмма отображает возможные переходы между тремя режимами: "Просмотр", "Редактирование" и "Создание нового сотрудника".

При выборе в главном меню приложения пункта "Сотрудник" Windows -форма FormEmployee должна перейти в режим "Просмотр", что определяет доступ к пунктам меню "Создать", "Редактировать", "Удалить" и запрет доступа к подпунктам меню "Отменить", "Сохранить".

Если в режиме просмотр выбирается подпункт меню "Удалить", то в результате выполнения данной функции режим Windows-формы FormEmployee не должен измениться, т.е. форма должна остаться в режиме "Просмотр".

Если в режиме просмотр выбирается подпункт меню "Изменить", то Windows-формы FormEmployee должна перейти в режим "Редактирование". Данный режим предполагает, что разрешается доступ к подпунктам меню "Отменить", "Сохранить" и запрещается доступа к подпунктам меню "Создать", "Редактировать", "Удалить".

Аналогичным образом интерпретируются переходы формы FormEmployee из одного режима в другой.

На рисунке 7.10 представлены режимы и переходы для подпунктов главного меню. Аналогичные режимы необходимо соблюдать для контекстного меню и кнопок панели инструментов.

Для управления доступом к пунктам главного меню создайте методы MenuItemEnabled(bool itemEnabled), для контекстного меню - MenuItemContextEnabled(bool itemEnabled) и для кнопок панели управления - StripButtonEnabled(bool itemEnabled). Управление доступностью пунктов главного и контекстного меню осуществляется через свойство Enabled класса ToolStripMenuItem, а кнопок панели управления - через свойство Enabled класса ToolStripButton.

Проверьте правильность режима управления пунктов главного и контекстного меню, а также кнопок панели управления формы FormEmployee.

С учетом того, что установка режимов просмотра и редактирования экранной формы, а также управление доступом к пунктам меню должно выполняться при реализации нескольких функций программы целесообразно для избежания дублирования кода все методы управления режимами объединить в один метод DisplayForm.

private void DisplayForm(bool mode)
{
    DisplayReadOnly(mode);
    MenuItemEnabled(mode);
    MenuItemContextEnabled(mode);
    StripButtonEnabled(mode);
}

Первоначальная установка режима "Просмотр" должна проводиться при первоначальной загрузке формы FormEmployee.

Задание на лабораторную работу

  • Изучить теоретический материал.
  • Для формы FormEmployee создать требуемые элементы контроля.
  • Разработать методы для задания режимов "Просмотр", "Редактирование" для элементов контроля.
  • Разработать методы для задания режимов "Просмотр", "Редактирование" для управления активностью пунктов главного меню формы, контекстного меню и кнопок панели инструментов.
  • Сформировать обработчик события Load.
  • Протестировать программу.
  • Страницы:

    Цель работы: Изучить основные элементы управления Windows -форм, их свойства и методы, а также получить практические навыки в разработке Windows -форм с элементами контроля

    Общие сведения

    Классы, представляющие графические элементы управления, находятся в пространстве имен System.Windows.Forms. С их помощью обеспечивается реакция на действия пользователя в приложении Windows Forms. Классы элементов управления связаны между собой достаточно сложными отношениями наследования. Общая схема таких отношений представлена на рисунке 7.1.

    Класс Control, как общий предок, обеспечивает все производные классы общим набором важнейших возможностей. В числе этих возможностей можно перечислить события мыши и клавиатуры, физические размеры и местонахождение элемента управления (свойства Height, Width, Left, Right, Location ), установку цвета фона и цвета переднего плана, выбор шрифта и т.п.

    При создании приложения можно добавить элементы управления на форму при помощи графических средств Visual Studio. Обычно достаточно выбрать нужный элемент управления в окне ToolBox и поместить его на форме. Visual Studio автоматически сгенерирует нужный код для формы. После этого можно изменить название элемента управления на более содержательное (например, вместо button1, предлагаемого по умолчанию, - buttonPrimer ) Visual Studio позволяет не только размещать на форме элементы управления, но и настраивать их свойства. Для этого достаточно щелкнуть на элементе управления правой кнопкой мыши и в контекстном меню выбрать Properties (Свойства).

    (рис 7.1) Иерархия элементов управления Windows Forms

    Все изменения, которые необходимо произвести в открывшемся окне (рисунок 7.2), будут добавлены в код метода InitializeComponents().

    То же самое окно позволяет настроить не только свойства данного элемента управления, но и обработку событий этого элемента. Перейти в список событий можно при помощи кнопки(рис 7.2) в закладке Properties (рисунок 7.3). Можно выбрать в списке нужное событие и рядом с ним сделать двойной щелчок или ввести имя метода или выбрать метод из списка.

    (рис 7.3) Настройка обработчиков событий

    После задания имени метода или двойного щелчка Visual Studio сгенерирует заготовку для обработчика события.

    Рассмотрим основные элементы управления Windows -форм.

    Элемент управления TextBox

    Элемент управления TextBox (текстовое окно) предназначен для хранения текста (одной или нескольких строк). При желании текст в TextBox может быть настроен как "только для чтения", а в правой и нижней части можно поместить полосы прокрутки.

    Класс TextBox происходит непосредственно от класса TextBoxBase, обеспечивает общими возможностями как TextBox, так и RichTextBox. Свойства, определенные в TextBoxBase, представлены в таблице 7.1.

    Свойства TextBoxBase
    Свойство Назначение
    AcceptsTab Определяет, что будет производиться при нажатии на клавишу Tab: вставка символа табуляции в само поле или переход к другому элементу управления
    AutoSize Определяет, будет ли элемент управления автоматически изменять размер при изменении шрифта на нем
    BackColor, ForeColor Позволяют получить или установить значение цвета фона и переднего плана
    HideSelection Позволяет получить или установить значение, определяющее, будет ли текст в TextBox оставаться выделенным после того, как этот элемент управления будет выведен из фокуса
    MaxLength Определяет максимальное количество символов, которое можно будет ввести в TextBox
    Modified Позволяет получить или установить значение, определяющее, был ли текст в TextBox изменен пользователем
    Multiline Указывает, может ли TextBox содержать несколько строк текста
    Readonly Помечает TextBox как "только для чтения"
    SelectedText, SelectionLength Содержат выделенный текст (или определенное количество символов) в TextBox
    SelectionStart Позволяет получить начало выделенного текста в TextBox
    Wordwrap Определяет, будет ли текст в TextBox автоматически переноситься на новую строку при достижении предельной длины строки

    В TextBoxBase также определено множество методов: для работы с буфером обмена ( Cut, Copy и Paste ), отменой ввода ( Undo ) и прочими возможностями редактирования ( Clear, AppendText и т. п.).

    Из всех событий, определенных в TextBoxBase, наибольший интерес представляет событие TextChange. Это событие происходит при изменении текста в объекте класса, производном от TextBoxBase. Например, его можно использовать для проверки допустимости вводимых пользователем символов (например, предположим, что пользователь должен вводить в поле только цифры или, наоборот, только буквы).

    Свойства, унаследованные от Control и от TextBoxBase, определяют большую часть возможностей TextBox. Свойств, определенных непосредственно в классе TextBox, не так уж и много. Они представлены в таблице 7.2.

    Свойства, определенные в классе TextBox
    Свойство Назначение
    AcceptsReturn Позволяет определить, что происходит, когда пользователь при вводе текста нажал на Enter. Варианта два: либо в TextBox начинается новая строка текста, либо активизируется кнопка по умолчанию на форме
    CharacterCasing Позволяет получить или установить значение, определяющее, будет ли изменяться регистр вводимых пользователем символов
    PasswordChar Позволяет выбрать символ, используемый для отображения вводимых пользователем данных (в поле для ввода пароля)
    ScrollBars Позволяет получить или установить значение, определяющее, будут ли в TextBox с несколькими строками присутствовать полосы прокрутки
    TextAlign Позволяет определить выравнивание текста в TextBox (используются значения из перечисления HorizontalAlignment )

    Значения перечисления HorizontalAlignment представлены в таблице 7.3.

    Значения перечисления HorizontalAlignment
    Значение Описание
    Center Выравнивание по центру
    Left Выравнивание по левому краю
    Right Выравнивание по правому краю

    Класс Button

    Кнопка ( button ) - это самый простой из всех элементов управления и при этом наиболее часто используемый. Можно сказать, что кнопка - это возможность принять ввод (щелчок кнопкой мыши или набор на клавиатуре) наиболее простым способом. Непосредственный предок класса System.Windows.FormButton в иерархии классов .NET - это класс ButtonBase, обеспечивающий общие возможности для целой группы производных от него элементов управления (таких как Button, CheckBox и RadioButton ). Некоторые свойства ButtonBase представлены в таблице 7.4.

    Свойства ButtonBase
    Свойство Назначение
    FlatStyle Позволяет настроить "рельефность" кнопки. Используются значения из перечисления FlatStyle
    Image Позволяет задать изображение, которое будет выводиться на кнопке (при этом можно указать точное местонахождение изображения). Фоновый рисунок лучше настраивать при помощи свойства BackgroundImage, определенного в базовом классе Control
    ImageAlign Позволяет определить выравнивание изображения, размещенного на кнопке. Используются значения из перечисления ContentAlignment
    Imagelndex, ImageList Эти свойства используются для работы с набором изображений (объектом ImageList ), выводимых на кнопке
    IsDefault Определяет, будет ли эта кнопка являться кнопкой по умолчанию (то есть срабатывать при нажатии на Enter )
    TextAlign Позволяет получить или установить выравнивание текста на кнопке. Также используются значения из перечисления ContentAlignment

    Сам класс Button не определяет каких-либо дополнительных возможностей помимо унаследованных от ButtonBase, за единственным, но существенным исключением свойства DialogResult. Это свойство позволяет возвращать значение при закрытии диалогового окна, например, при нажатии кнопок ОК или Cancel (Отменить).

    В подавляющем большинстве случаев выравнивание текста, размещенного на кнопке, производится по центру, так что текст будет размещен строго посередине кнопки. Однако если нам по каким-то причинам необходимо использовать другой стиль выравнивания, в нашем распоряжении - свойство TextAlign, определенное в классе ButtonBase. Для TextAlign используются значения из перечисления ContentAlignment (таблица 7.5). Значения из того же перечисления используются и для определения положения изображения на кнопке.

    Значения перечисления ContentAlignment
    Значение Описание (выравнивание)
    BottomCenter По нижнему краю кнопки, относительно боковых краев - посередине
    BottomLeft Но нижнему краю кнопки, слева
    BottomRight По нижнему краю кнопки, справа
    MiddleCenter По центру кнопки
    MiddleLeft Относительно верхнего и нижнего краев - по центру, относительно боковых краев - слева
    MiddleRight Относительно верхнего и нижнего краев - по центру, относительно боковых краев - справа
    TopCenter По верхнему краю кнопки, относительно боковых краев - посередине
    TopLeft По верхнему краю кнопки, слева
    TopRight По верхнему краю кнопки, справа

    Флажки

    Для флажка (тип CheckBox ) предусмотрено три возможных состояния. Как и тип Button, CheckBox наследует большую часть своих возможностей от базовых классов Control и ButtonBase. Однако в этом классе существуют и свои собственные члены, обеспечивающие дополнительные уникальные возможности. Наиболее важные свойства CheckBox представлены в таблице 7.6.

    Свойства класса CheckBox
    Свойство Назначение
    Appearance Настраивает вид флажка. Для этого свойства используются значения из перечисления Appearance
    AutoCheck Позволяет получить или установить значение, определяющее, будут ли значения Checked и CheckState, а также внешний вид флажка автоматически изменяться при щелчке на нем
    CheckAlign Позволяет установить горизонтальное и вертикальное выравнивание собственно флажка (квадратика) в элементе управления CheckBox. Используются значения из перечисления ContentAlignment
    Checked Возвращает значение типа bool, представляющее текущее состояние флажка (выбран или не выбран) Если для свойства ThreeState установлено значение true, то свойство Checked будет возвращать true как для явно выбранного флажка, так и для того флажка, для которого установлено значение "не определено" ( indeterminate )
    CheckState Позволяет получить или установить значение флажка (установлен - не установлен - не определено), используя не true и false, как в Checked, а три значения из перечисления CheckState. Обычно используется, если свойство ThreeState для флажка имеет значение true (то есть он допускает три значения).
    ThreeState Определяет, будут ли для флажка использоваться три значения (из перечисления CheckState ) или только два

    Возможные состояния флажка ( Indeterminate можно использовать только тогда, когда для свойства ThreeState установлено значение true ) представлены в таблице 7.7.

    Значения перечисления CheckState
    Значение Описание
    Checked Флажок установлен
    Indeterminate Значение не определено (обычно флажок выглядит как "серый", затененный)
    Unchecked Флажок снят

    Состояние "значение не определено" ( indeterminate ) может быть установлено, например, для верхнего элемента иерархии, в которой для одной части подчиненных элементов флажок установлен, а для другой - снят.

    Переключатели и группирующие рамки

    Тип RadioButton (переключатель) можно воспринимать, как несколько видоизмененный флажок при этом сходство между этими типами подчеркивается почти полным совпадением наборов членов. Между типами RadioButton и CheckBox существуют лишь два важных различия: в RadioButton предусмотрено событие CheckedChanged (возникающее при изменении значения Checked ), а кроме того, RadioButton не поддерживает свойство ThreeState и не может принимать состояние Indeterminate (не определено).

    Переключатели всегда используются в группах, которые рассматриваются как некое единое целое. Внутри группы переключателей одновременно может быть выбран только один переключатель. Для группировки переключателей в группы используется тип GroupBox.

    И флажок ( CheckBox ), и переключатель ( RadioButton ) поддерживают свойство Checked, при помощи которого очень удобно получать информацию о состоянии соответственно флажка и переключателя. Однако если есть необходимость задействовать дополнительное третье состояние флажка (не определено - Indeterminate ), то придется вместо Checked использовать свойство CheckState и значения из одноименного перечисления CheckState.

    Элемент управления CheckedListBox

    Типы Button, CheckBox и RadioButton являются производными от ButtonBase, и их можно определить как некие разновидности кнопок. К членам семейства списков относятся CheckedListBox (список с флажками), ListBox (список) и ComboBox (комбинированный список).

    Элемент управления CheckedListBox (список с флажками) позволяет помещать обычные флажки внутри поля с полосами прокрутки.

    Кроме того, в элементе управления CheckedListBox предусмотрена возможность использования нескольких столбцов. Для этого достаточно установить значение true для свойства MultiColumn.

    CheckedListBox наследует большинство своих возможностей от типа ListBox. To же самое справедливо и в отношении класса ComboBox. Наиболее важные свойства System.Windows.Forms.ListBox представлены в таблице 7.8.

    Свойства класса ListBox
    Свойство Назначение
    ScrollAlwaysVisible Определяет, будет ли полоса прокрутки выводиться всегда
    Selectedlndex Индекс выделенного в настоящий момент элемента в списке (если такой имеется). Если ни один элемент не выделен, то возвращается значение -1
    SelectedIndices Набор индексов выделенных в настоящий момент элементов в списке. Если не выделен ни один элемент, то возвращается пустой набор
    SelectedItem Значение выделенного в настоящий момент элемента. Если ни один из элементов не выделен, то возвращается null
    SelectedItems Возвращает коллекцию значений выделенных элементов (для списков, в которых допускается выбор нескольких значений)
    SelectionMode Определяет число элементов, которые возможно выбрать в списке одновременно. Для этого свойства используются значения из перечисления SelectionMode
    Sorted Определяет, будут ли элементы в списке упорядочены (по алфавиту) или нет
    TopIndex Возвращает индекс первого видимого элемента в списке

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

    Комбинированные списки

    Как и списки (объекты ListBox ), комбинированные списки (объекты ComboBox ) позволяют пользователю производить выбор из списка заранее определенных элементов. Однако у комбинированных списков есть одно существенное отличие от обычных: пользователь может не только выбрать готовое значение из списка, но и ввести свое собственное. Класс ComboBox наследует большинство своих возможностей от класса ListBox (который, в свою очередь, является производным от Control ), однако в нем предусмотрены и собственные важные свойства, представленные в таблице 7.9.

    Свойства ComboBox
    Свойство Назначение
    DroppedDown "Раскрывающийся вниз": определяет, будет ли список ниспадающим
    MaxDropDownltems Определяет максимальное количество элементов, которое будет показано в нижней части ниспадающего списка. Допустимые значения - от 1 до 100
    MaxLength Определяет максимальную длину текста, который пользователь может ввести в ComboBox
    Selectedlndex Определяет индекс выделенного элемента ComboBox. Если ни один элемент не выделен, возвращается значение -1
    Selectedltem Возвращает ссылку на объект выделенного элемента ComboBox
    SelectedText Возвращает выделенный текст в поле редактирования ComboBox
    SelectionLength Определяет длину (в символах) выделенного текста в поле редактирования ComboBox
    Style Позволяет получить или установить стиль ComboBox. Для этого свойства используются значения из перечисления ComboBoxStyle
    Text Позволяет получить доступ к тексту в поле редактирования. При работе с ComboBox это унаследованное свойство используется чаще всех остальных

    Стиль для ComboBox можно настроить при помощи свойства Style, для которого используются значения из перечисления ComboBoxStyle (таблица 7.10).

    Значения перечисления ComboBoxStyle
    Значение Описание
    DropDown Пользователь может вводить значения в поле редактирования. Для отображения списка пользователь должен нажать на кнопку со стрелкой, направленной вниз ( Arrow Button )
    DropDownList Пользователь не может вводить значения в поле редактирования. Для отображения списка пользователь должен нажать на кнопку со стрелкой, направленной вниз ( Arrow Button )
    Simple Пользователь может вводить значения в поле редактирования. Список значений виден всегда

    Порядок перехода по Tab

    Если на форме размещено несколько элементов управления, то пользователи обычно ожидают, что между ними можно будет перемещаться с помощью клавиши Tab. Часто бывает необходимо после размещения элементов управления настроить порядок перехода между ними. Для этого используются два свойства (унаследованные от базового класса Control и поэтому общие для всех элементов управления): TabStop и Tablndex. Для свойства TabStop используются только два значения: true и false. Если для TabStop установлено значение true, то к этому элементу управления можно будет добраться с помощью клавиши Tab. Если же установлено значение false, то участвовать в переходах по Tab этот элемент управления не будет. Если элемент управления TabStop имеет значение true, то очередность перехода можно настроить с помощью свойства Tablndex:

    В Visual Studio.NET предусмотрено средство, при помощи которого можно быстро настроить порядок перехода для элементов управления на форме. Это средство называется Tab Order Wizard и оно доступно из меню View (View > Tab Order). Чтобы изменить значения TabIndex для каждого элемента управления, достаточно просто щелкать мышью на элементах управления в выбранном нами порядке перехода. Для элементов управления, помещенных в группирующую рамку, Tab Order Wizard создает отдельную последовательность перехода.

    Элемент управления MonthCalendar

    В пространстве имен System.Windows.Forms предусмотрен элемент управления, при помощи которого пользователь может выбрать дату или диапазон дат, используя дружественный и удобный интерфейс. Это элемент управления MonthCalendar.

    Наиболее важные свойства MonthCalendar представлены в табл. 7.11.

    Свойства MonthCalendar
    Свойство Назначение
    BoldedDates Массив объектов DateTime, выделенных подсветкой
    CalendarDimensions Определяет количество выводимых строк и столбцов
    FirstDayOfWeek Определяет, с какого дня будет начинаться неделя в MonthCalendar
    MaxDate Самая поздняя дата, которую разрешается выбрать пользователю (по умолчанию ограничений нет)
    MaxSelectionCount Максимальное количество дат, которое одновременно может выбрать пользователь
    MinDate Самая ранняя дата, которую разрешается выбрать пользователю (по умолчанию ограничений нет)
    MonthlyBoldedDates Массив выделенных подсветкой объектов DateTime для месяца
    SelectionRange Диапазон выделенных объектов
    SelectionEnd Самая поздняя дата в диапазоне выделенных объектов
    SelectionStart Самая ранняя дата в диапазоне выделенных объектов
    ShowToday Определяет, будет ли MonthCalendar выводить информацию о текущей дате
    ShowTodayCircle Определяет, будет ли MonthCalendar выводить информацию о текущей дате в нижней части и выделять ее в календаре обводкой
    ShowWeekNumbers Определяет, будет ли MonthCalendar отображать номера недель справа от каждой строки
    TodayDate Дата, которая будет считаться MonthCalendar сегодняшней. По умолчанию TodayDate - это системная дата на момент создания объекта MonthCalendar
    TodayDateSet Определяет, можно ли пользователю по своему усмотрению выбирать сегодняшнюю дату. Если для этого свойства установлено значение true, пользователь может выбрать в качестве сегодняшней ( TodayDate ) любое число

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

    Можно получить дату, выбранную пользователем в MonthCalendar, при помощи свойства SelectionStart. Это свойство возвращает ссылку на объект DateTime, которая хранится в специальной переменной ( d ) При помощи набора свойств типа DateTime можно извлечь всю необходимую информацию в нужном нам формате.

    При помощи свойств Month, Day и Year можно извлечь из объектов DateTime нужную информацию и сформировали текстовые строки. Это вполне допустимый подход. Дело в том, что дату в необходимом текстовом формате проще получить из DateTime при помощи специальных "форматирующих" свойств самих объектов DateTime. Набор таких свойств (и некоторые методы) представлен в таблице 7.12.

    Члены класса DateTime
    Член Назначение
    Date Позволяет получить информацию о дате (дата всегда отсчитывается от полуночи)
    Day, Month, Year Позволяют получить соответственно день, месяц и число из текущего объекта DateTime
    DayOfWeek Возвращает день недели для объекта DateTime
    DayOfYear Возвращает номер дня в году для объекта DateTime
    Hour, Minute, Second, Millisecond Возвращают информацию о часе, минутах, секундах и миллисекундах для объекта DateTime
    MaxValue, MinValue Возвращают минимальное и максимальное значения для DateTime
    Now, Today Эти два статических свойства типа DateTime позволяют получить информацию о текущей дате и времени ( Now ) или только о текущей дате ( Today )
    Ticks Позволяет получить счетчик "тиков" (с интервалом в 100 наносекунд) для объекта DateTime
    ToLongDateString( ), ToLongTimeString( ), ToShortDateString( ), ToShortTimeString( ) Преобразуют текущее значение объекта DateTime в разные виды текстового представления

    При помощи вышеперечисленных членов можно значительно упростить вывод текстовой информации о дате.

    Элемент управления Panel

    Назначение элемента управления Panel (панель) - с его помощью можно объединить прочие элементы управления на форме. Panel происходит от базового класса ScrollableControl и поддерживает полосы прокрутки.

    Элементы управления Panel обычно используются для экономии пространства на форме. Например, если элементы управления, которые планируем разместить на форме, на ней не умещаются, то можно поместить их внутрь Panel и установить для свойства AutoScrol1 объекта Panel значение true. В результате пользователь получит возможность доступа к "не вмещающимся" элементам управления с помощью полос прокрутки.

    Всплывающие подсказки (ToolTips)

    Большинство приложений с современным пользовательским интерфейсом поддерживают всплывающие подсказки. В приложениях .NET эта возможность реализуется при помощи типа System.Windows.Forms.ToolTip. ToolTip (всплывающие подсказки) - это небольшие окна с текстом, появляющиеся при наведении указателя мыши на элемент управления на форме. Наиболее важные члены класса ToolTip представлены в таблице 7.13.

    Члены класса ToolTip
    Член Назначение
    Active Определяет, будет ли всплывающая подсказка активной. Возможность отключить всплывающие подсказки может быть полезной, например, если в приложении предусмотрено два варианта интерфейса: для обычных и для опытных пользователей
    AutomaticDelay Позволяет получить или установить время задержки (в миллисекундах) при появлении подсказки
    AutoPopDelay Время (в миллисекундах), в течение которого подсказка остается видимой, если указатель мыши неподвижен и находится в области, занимаемой соответствующим элементом управления. По умолчанию это значение равно 10 значениям AutomaticDelay
    GetTooltip( ) Возвращает текст подсказки
    InitialDelay Время (в миллисекундах), в течение которого указатель должен оставаться неподвижным в соответствующей области для появления подсказки. Значение по умолчанию равно значению AutomaticDelay
    ReshowDelay Время (в миллисекундах), в течение которого появится другая подсказка при перемещении указателя мыши от одного элемента управления к другому. По умолчанию это значение равно 1/5 от значения AutomaicDelay
    SetToolTip( ) Ассоциирует подсказку с элементом управления

    Для того чтобы настроить использование всплывающих подсказок для элементов управления можно сделать это с помощью графических средств Visual Studio.

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

    Проектирование элементов управления формы FormEmployee

    Для разработки проекта приложения форма FormEmployee должна содержать элементы управления, в соответствии с видом, приведенном на рисунке 7.4 .

    (рис 7.4) Вид экранной формы FormEmployee

    На данной форме необходимо сформировать элементы управления, приведенные в таблице 7.14.

    Элементы управления формы FormEmployee
    Элемент контроля Имя Свойство Text/Items Назначение
    SplitContainer splitContainerEmployee Две панели с разделителем
    Label labelListEmployee Список сотрудников Надпись
    listBox listBoxEmployee Список сотрудников
    Label labelSurname Фамилия Надпись
    Label labelName Имя Надпись
    Label labelPatronymic Отчество Надпись
    Label labelJobRole Должность Надпись
    Label labelStatus Статус Надпись
    Label labelAccess Уровень доступа Надпись
    label labelNetName Сетевое имя Надпись
    textBox textBoxNetName Сетевое имя
    textBox textBoxSurname Фамилия
    textBox textBoxName Имя
    textBox textBoxPatronymic Отчество
    comboBox comboBoxJobRole Должность
    comboBox comboBoxStatus Активен, выходной, в отпуске, болеет, не работает, помечен как удаленный Статус
    comboBox comboBoxAccess Оператор, старший оператор, начальник смены, администратор, аналитик Уровень доступа
    menuItem menuItemAction Действие Пункт меню "Редактировать"
    menuItem menuItemUndo Отменить Подпункт меню "Отменить"
    menuItem menuItemNew Создать Подпункт меню "Новый"
    menuItem menuItemEdit Изменить Подпункт меню "Изменить"
    menuItem menuItemSave Сохранить Подпункт меню "Сохранить"
    menuItem menuItem Удалить Подпункт меню "Удалить"
    menuItem menuItemReport Отчет Пункт меню "Отчет"
    menuItem menuItemReport1 По сотруднику Подпункт меню "Отчет по сотруднику"
    menuItem menuItemReport2 По всем сотрудникам Подпункт меню "Отчет по всем сотрудникам"

    Вначале создайте на форме элемент SplitContainer (рисунок 7.5). На панели 1 создайте элементы управления labelListEmployee и listBoxEmployee (рисунок 7.6), а остальные элементы управления, приведенные в таблице 7.14, - на панели 2 (рисунок 7.4).

    После создания на форме FormEmployee элементов управления в соответствии с таблицей 7.14 необходимо настроить порядок перехода между ними при нажатии клавиши Tab.

    (рис 7.6) Создание панелей на форме FormEmployee(рис 7.5) Формирование элементов управления на панели 1 формы FormEmployee

    Для этого необходимо задать последовательные номера свойству TabIndex элементов управления (в разрабатываемой форме это необходимо сделать для элементов управления TextBox и ComboBox ) из окна Properties (рисунок 7.7) или вызвать мастер Tab Order Wizard из меню View/Tab Order (рисунок 7.8). Задание последовательности значений свойству TabIndex производится щелчком мыши на элементах управления в заданной последовательности.

    (рис 7.8) Задание свойства TabIndex для элемента контроля(рис 7.7) Настройка перехода по элементам управления

    Результат настройки порядка перехода между элементами управления при нажатии клавиши Tab приведен на рисунке 7.9.

    Для работы с формой необходимо создать методы, которые разрешают только просматривать форму (режим просмотра) и редактировать форму (режим редактирования).

    (рис 7.9) Результат работы мастера Tab Order Wizard

    Создадим метод для задания режима просмотра формы DisplayReadOnly. Метод DisplayReadOnly должен быть общедоступным, ничего не должен возвращать и не иметь параметров. Для задания режима просмотра (только для чтения) объекту класса TextBox необходимо свойству ReadOnly присвоить значение true, а для объекта класса comboBox - свойству Enabled значение false. Код метода DisplayReadOnly представлен далее:

    public void DisplayReadOnly()
    {
        this.textBoxSurname.ReadOnly = true;
        this.textBoxName.ReadOnly = true;
        this.textBoxPatronymic.ReadOnly = true;
        this.textBoxNetName.ReadOnly = true;
        this.comboBoxJobRole.Enabled = false;
        this.comboBoxStatus.Enabled = false;
        this.comboBoxAccess.Enabled = false;
    }

    Аналогичным образом сформируем метод DisplayEdit, который задает режим редактирования формы:

    /// Задание режима редактирования
    public void DisplayEdit()
    {
        this.textBoxSurname.ReadOnly = false;
        this.textBoxName.ReadOnly = false;
        this.textBoxPatronymic.ReadOnly = false;
        this.textBoxNetName.ReadOnly = false;
        this.comboBoxJobRole.Enabled = true;
        this.comboBoxStatus.Enabled = true;
        this.comboBoxAccess.Enabled = true;
    }

    Для управления режимом доступности (только для чтения/редактирование) формы FormEmployee необходимо метод DisplayReadOnly вызывать при первоначальной загрузке формы (событие Load ), при создании новых данных по сотруднику и при редактировании данных по сотруднику, а метод DisplayEdit - при сохранении данных по сотруднику и при отмене режима редактирования данных.

    Проверьте правильность режима управления доступностью элементов управления формы FormEmployee.

    Анализ кодов методов DisplayReadOnly( ) и DisplayEdit( ) показывает, что они могут быть объединены в один метод с параметром. Необходимо самостоятельно написать объединенный метод, получив в результате метод DisplayReadOnly(bool readOnly), в котором параматр readOnly определяет режим редактирования: если readOnly равен true, то режим только для просмотра, если равен false, то - редактирование.

    В процессе работы приложения необходимо управлять доступом к пунктам меню в соответствии с диаграммой состояний для пунктов меню формы FormEmployee, приведенной на рисунке 7.10.

    (рис 7.10) Диаграмма состояний для активности подпунктов меню "Действие"

    Диаграмма отображает возможные переходы между тремя режимами: "Просмотр", "Редактирование" и "Создание нового сотрудника".

    При выборе в главном меню приложения пункта "Сотрудник" Windows -форма FormEmployee должна перейти в режим "Просмотр", что определяет доступ к пунктам меню "Создать", "Редактировать", "Удалить" и запрет доступа к подпунктам меню "Отменить", "Сохранить".

    Если в режиме просмотр выбирается подпункт меню "Удалить", то в результате выполнения данной функции режим Windows-формы FormEmployee не должен измениться, т.е. форма должна остаться в режиме "Просмотр".

    Если в режиме просмотр выбирается подпункт меню "Изменить", то Windows-формы FormEmployee должна перейти в режим "Редактирование". Данный режим предполагает, что разрешается доступ к подпунктам меню "Отменить", "Сохранить" и запрещается доступа к подпунктам меню "Создать", "Редактировать", "Удалить".

    Аналогичным образом интерпретируются переходы формы FormEmployee из одного режима в другой.

    На рисунке 7.10 представлены режимы и переходы для подпунктов главного меню. Аналогичные режимы необходимо соблюдать для контекстного меню и кнопок панели инструментов.

    Для управления доступом к пунктам главного меню создайте методы MenuItemEnabled(bool itemEnabled), для контекстного меню - MenuItemContextEnabled(bool itemEnabled) и для кнопок панели управления - StripButtonEnabled(bool itemEnabled). Управление доступностью пунктов главного и контекстного меню осуществляется через свойство Enabled класса ToolStripMenuItem, а кнопок панели управления - через свойство Enabled класса ToolStripButton.

    Проверьте правильность режима управления пунктов главного и контекстного меню, а также кнопок панели управления формы FormEmployee.

    С учетом того, что установка режимов просмотра и редактирования экранной формы, а также управление доступом к пунктам меню должно выполняться при реализации нескольких функций программы целесообразно для избежания дублирования кода все методы управления режимами объединить в один метод DisplayForm.

    private void DisplayForm(bool mode)
    {
        DisplayReadOnly(mode);
        MenuItemEnabled(mode);
        MenuItemContextEnabled(mode);
        StripButtonEnabled(mode);
    }

    Первоначальная установка режима "Просмотр" должна проводиться при первоначальной загрузке формы FormEmployee.

    Задание на лабораторную работу

  • Изучить теоретический материал.
  • Для формы FormEmployee создать требуемые элементы контроля.
  • Разработать методы для задания режимов "Просмотр", "Редактирование" для элементов контроля.
  • Разработать методы для задания режимов "Просмотр", "Редактирование" для управления активностью пунктов главного меню формы, контекстного меню и кнопок панели инструментов.
  • Сформировать обработчик события Load.
  • Протестировать программу.
  • Вернуться к учебному плану