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

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

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

Последней темой, которую мне хотелось бы охватить при обсуждении 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 .

Извлечение данных при помощи сохраняемых процедур

сохраняемая процедура может быть просто

Когда вы работаете с сохраняемыми процедурами, часто бывает необходимо предоставить им параметры, которые повлияют на их исполнение. Сохраняемая процедура может быть просто оболочкой запроса, который будет возвращать строки данных, либо она может обновлять, добавлять или удалять данные в базе данных. В любом из этих случаев вы обычно должны сообщить сохраняемой процедуре, над какими данными она должна производить операции, и это делается посредством параметров. Давайте начнем с простого примера. В базе данных Northwind определена сохраняемая процедура с именем CustOrderHist. Вы предоставляете ей ID заказчика, и она возвратит результирующий набор, содержащий сводку продуктов и их количеств, заказанных этим заказчиком. Для вызова сохраняемых процедур в ADO. NET используется класс SqlCommand, как демонстрировалось выше. Однако вам нужно сообщить объекту команды, что вы вызываете сохраняемую процедуру, а не передаете текстовый запрос. Вы также должны предоставить объекту команды любые параметры, которые необходимо передать исполняемой процедуре. Как это делается, показывает листинг Г. 6. В данном случае вы создаете объект команды, специфицируя не строку запроса SQL, а имя сохраняемой процедуры, которую хотите вызвать, и устанавливаете свойство CommandType Команды равным StoredProcedure . Затем вам нужно создать объект SqlParameter , чтобы инкапсулировать каждый из параметров, необходимых сохраняемой процедуре, и добавить их к коллекции Parameters Команды. Как только все подготовлено, вы можете, как и раньше, вызвать метод Fill Адаптера данных, и он вызовет указанную сохраняемую процедуру, поместив результирующий набор в таблицу в наборе данных.

Функции Add Query

если вы хотите получить аналогичные

Функции Add Query доступны только для типизированных наборов данных, входящих в проект Windows Forms. Если вы хотите получить аналогичные функциональные возможности для набора данных, определенного в другой сборке, например, в сборке уровня доступа к данным, вам придется вручную добавить запрос в адаптер таблицы, вручную добавить Toolstrip И его элементы управления на форму и написать код, исполняющий запрос через метод адаптера таблицы и помещающий результаты в соответствующий источник привязки для формы. Иными словами, конструктор поможет вам только в том случае, когда вы следуете плохой методике проектирования и размещаете код доступа к данным внутри проекта Windows Forms. Вторым пунктом в нижней части контекстной закладки, отображаемым для каждого элемента управления или компонента, привязанного к типизированному набору данных в проекте Windows Forms, является Preview Data. При его выборе откроется диалог Preview Data, изображенный на рис. 5.23. Если щелкнуть на кнопке Preview в этом диалоге, будет исполнен соответствующий метод GetData Адаптера таблицы и в разделе Results будут отображены данные для предварительного просмотра. Элементы управления ComboBox И ListBox Снабжены контекстными закладками, которые можно использовать для установки их свойств привязки. Прежде всего необходимо пометить флажок Use Data Bound Items, после чего ниже появятся четыре комбинированных поля. Каждое из них позволяет вам открыть окно Data Sources, как описывалось ранее для свойств DataSource И DataMember В окне Properties.