1. Построение приложений с привязанными данными в Windows Forms

Начала привязки данных в WinFx

в winfx существует и развитая

Итак, вы познакомились с парой простых программных приложений WinFx, но с данными в них ничего не происходило. В WinFx существует и развитая модель установки привязанных к данным элементов управления. Ее работа несколько отличается от того, что имеет место в Windows

Forms, и рассчитана на достижение большей гибкости и написание меньшего объема кода. Элементы WinFx ориентируются на концепцию контекста привязки данных, который автоматически передается дочерним элементам: из приложения к нижележащим оконным объектам, и далее вниз к дочерним элементам управления. Поэтому когда у вас есть источник данных, который нужно привязать к нескольким элементам управления, возможно, даже в различных окнах, вы можете организовать контекст данных, который позволит вам инициализировать и установить источник данных в одном месте, и будет автоматически передан вниз по каскадам дерева элементов к любым дочерним элементам, которые не устанавливают явным образом собственный контекст. Если вы внимательно прочитали главы этой книги, это должно вам кое-что напоминать. Подход к привязке в WinFx несколько сходен с работой объектов BindingSource В Windows Forms. Они представляют собой своего рода комплексный пункт для данных, к которым может быть привязано несколько элементов управления. Однако есть несколько явных отличий, как в способе объявления и инициализации привязок, так и в механизме их передачи другим элементам. В Windows Forms, чтобы создать ассоциацию между конкретным источником привязки и элементом управления, вы должны явным образом установить в свойстве DataSource Элемента управления ссылку на BindingSource, Либо добавить к коллекции DataBindings Элемента управления соответствующий объект Binding. Затем вы специфицируете еще и путь внутри источника данных к тому компоненту, к которому вы хотите привязаться. В случае привязок WinFx вам нужно только указать желаемый путь внутри контекста данных, а элемент управления автоматически воспримет контекст данных, установленный в его родительском дереве элементов.

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

как и во многих элементах

Элемент управления TextBox Позволяет вам создавать однострочные и многострочные текстовые поля для ввода или отображения. Как и во многих элементах управления, его свойство Text Определяет строку, которая отображается внутри текстового поля. Когда вы помещаете текстовое поле на форму, режимом по умолчанию является однострочное поле. Если вам нужно многострочное, вы изменяете свойство Multiline На True. Через свойство Scrollbars У вас есть контроль над тем, будут ли у вас линейки прокрутки, когда вы находитесь в многострочном режиме. В. NET вам не нужно использовать для текстовых полей различного вида разные элементы управления, как это было в некоторых ранних инструментах разработки и языках. Однако в элементе управления текстового поля вы ограничены простым текстовым содержанием, и если вам нужно разрешить пользователям форматировать текст, который они вводят, то вы можете предоставить им элемент управления RichTextBox. Как и в случае элемента управления CheckBox, Вы можете обрабатывать событие CheckChanged, Чтобы отслеживать изменения выбора радиокнопок, либо просто проверять значение свойства Checked, Когда это потребуется для обработки. Класс RadioButton Является производным от CheckBox, И именно оттуда он получает определение этих свойств. Не совершайте только принципиального греха, используя радиокнопку там, где уместно поле флажка, и наоборот. Радиокнопки предназначены для взаимоисключающих вариантов выбора; флажки — для независимого выбора. Это часто нарушаемый момент в разработке пользовательского интерфейса, о котором вы не должны забывать. Элемент управления RichTextBox Позволяет пользователю вводить и форматировать текст, используя возможности, поддерживаемые спецификацией формата обогащенного текста. Подобно элементу управления TextBox, Строковое содержимое элемента управления доступно через свойство Text. Свойство Rtf Экспонирует содержимое со всеми встроенными кодами форматирования. Если пользователь вставляет в элемент управления форматированный текст из какой-то другой программы, поддерживающей форматирование, например, из Word или из Web-страницы, в тексте внутри элемента управления форматирование сохранится. Если вы хотите, чтобы пользователи имели возможность форматировать текст, который они вводят в элемент управления, то вам нужно будет предусмотреть другие элементы управления или горячие клавиши, которые позволят им исполнять команды форматирования для выбранного в элементе управления текста.

Форматирование при помощи стилей

как уже упоминалось модель форматирования

Последней темой, которую мне хотелось бы охватить при обсуждении DataGridView, Является реализация специального форматирования ячеек. Как уже упоминалось, модель форматирования сетки обладает богатыми возможностями. Стили в сетке организованы по уровням, что позволяет вам установить стили более общего плана, а затем уточнить их на более подробном уровне. Например, вы могли бы установить стиль ячейки по умолчанию, относящийся ко всем ячейкам сетки, затем для одного из столбцов задать стиль с другим форматированием, а для некоторых ячеек этого столбца задать еще один стиль. Это делается путем установки ряда свойств стиля ячеек по умолчанию, экспонируемых сеткой, которые затем можно уточнять, устанавливая стили на уровне отдельной ячейки. Как можно видеть наинизшим уровнем модели является свойство DefaultCellstyle. Этот стиль будет использован по умолчанию для любой ячейки в сетке, для которой не установлено никакого стиля на каком-либо другом уровне стиля. Следующий уровень содержит RowHea — DersDefaultCellStyle И ColumnHeadersDefaultCellStyle, Которые воздействуют на способ представления заголовочных ячеек. Выше лежат свойство DataGridViewColumn. DefaultCellstyle И следующее за НИМ DataGridViewRow .DefaultCellstyle, Представляющие стили по умолчанию для отдельных столбцов или отдельных строк. Сетка поддерживает также стиль ячеек для перемежающихся строк, задаваемый свойством Alterna — TingRowsDefaultCellStyle. Наконец, наивысшим уровнем, который отменяет установки, сделанные на любом из более низких уровней, является СВОЙСТВО DataGridViewCell .CellStyle. Вы можете устанавливать эти свойства программно, обращаясь к соответствующим элементам экземпляров сетки, столбца, строки или ячейки. Все эти свойства относятся к типу DataGridViewCellStyle, Который экспонирует свойства для установки шрифта, цвета, выравнивания, заполнения и форматирования значений. Можно также конфигурировать стили ячейки в конструкторе. Всякий раз, когда вы обращаетесь к одному из свойств стиля ячейки в сетке или столбце через окно Properties либо через редакторы свойств контекстной вкладки в конструкторе, появляется диалог CellStyle Builder, показанный на рис. 6.12.

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

он выглядит подобно элементу управления

Элемент управления DateTimePicker Довольно сложен и допускает отображение и редактирование форматированной информации о дате и времени. Он выглядит подобно элементу управления ComboBox, Внутри которого в текстовой форме отображается информация даты и времени. Форматирование этого отображения может быть задано на основе нескольких предопределенных форматов или путем спецификации специальной строки форматирования. Если выбрать стрелку выпадающего списка, появляется элемент управления календаря, предоставляющий пользователю интуитивно ясный и гибкий механизм выбора. Событием по умолчанию является событие ValueChanged, Которое можно обрабатывать, чтобы получать уведомления об изменении даты и времени или о том, что в элементе управления произошел выбор даты. Вы используете элемент управления ListBox Для представления пользователям списка элементов, обычно позволяя им выбрать один или несколько элементов списка в качестве одного из аспектов задачи ввода данных. Поле списка обычно используется, когда вы хотите, чтобы пользователь видел одновременно несколько элементов, доступных для выбора, часто с возможностью выбора нескольких элементов сразу. Поля списков хранят элементы, представляемые в списке, в виде набора объектных ссылок, сохраняемых в коллекции типа ListBox.ObjectCol — Lection, Вложенного типа в классе ListBox. Когда поле списка отображает хранящееся в нем элементы, он вызывает метод ToString Каждой объектной ссылки, и результат этих вызовов даст то, что будет представлено пользователю. Вы можете поместить в эту коллекцию объект любого рода, так что вы можете держать все данные, ассоциированные с отображаемым значением, в одном месте, и только строковое представление данного объекта будет передаваться в состав элементов списка.

Допустим, например, для какой-то задачи вы хотите представлять пользователям для выбора список заказчиков. Однако когда форма будет обрабатываться, вам потребуется ID заказчика и, возможно, другая информация, чтобы произвести обработку в соответствии с выбором. Для поддержки такого сценария вы могли бы создать класс Customer, Который переопределяет метод ToString, Унаследованный от базового класса System. Object

Управление поведением верификации посредством свойства AutoValidate

так сделано по соображениям обратной

По умолчанию приложения Windows Forms 2.0, когда вы устанавливаете в True Свойство Cancel Аргумента события Validating, Будут вести себя так же, как в предыдущих версиях, — это предотвращает уход фокуса с элемента управления и прекращает процесс верификации, так что событие Validated Не запускается. Так сделано по соображениям обратной совместимости. Однако в класс ContainerControl Было включено новое свойство, которое позволяет вам при желании модифицировать такое поведение. Если вы собираетесь производить верификацию программно для всей формы, или просто не хотите заставлять пользователей корректировать проблемные элементы управления по одному, вы можете изменить значение свойства AutoValidate Для формы. Это свойство принимает значение перечислимого типа AutoValidate, Который позволяет устанавливать любое из значений, описанных в таблице 10.3. Значением по умолчанию для этого свойства является Enable Prevent FocusChange, Которое моделирует поведение. NET 1.1. Обычно вы будете устанавливать AutoValidate Равным EnableAllow — FocusChange Или Disable, Если собираетесь вручную производить верификацию на уровне формы, используя метод ValidateChildren, Описанный в следующем разделе. Как упоминалось выше, метод validate производит верификацию текущего элемента управления в фокусе и каждого из его предков. Однако чаще требуется верифицировать все элементы управления на форме в ответ на некоторое событие, например, нажатие пользователем кнопки Save или Submit. В. NET 2.0 это становится чрезвычайно просто, причем у вас есть ряд опций для контроля над тем, что будет происходить в процессе верификации.

Если вы хотите произвести верификацию всех элементов управления на форме или их подмножества, определяемого некоторыми общими атрибутами, вы можете вызвать метод Validatechildren Класса ContainerControl. От ContainerControl Производятся Form, UserControl И другие классы, поэтому они наследуют эту функцию верификации. Имеются две перегрузки метода Validatechildren, Одна без аргументов, а другая с перечислимым аргументом типа ValidationConstraints .