3. Общее представление о привязке данных в Windows Forms

Обработчик Page Load

в реальных приложениях такой вызов

Обработчик Page Load Извлекает данные заказчиков в экземпляр типизированного набора данных NorthwindDataSet С помощью вспомогательного класса доступа к данным, являющегося частью проекта. В реальных приложениях такой вызов обычно передается далее на уровень доступа к данным или рабочий уровень. После того как код страницы примет данные в элемент-переменную, он использует их для установки свойства DataSource Элемента управления DataGrid, И устанавливает DataMember Строкой "Customers", Показывая, что действительным источником табличных данных для сетки является таблица Customers внутри набора данных. Это должно быть очень похоже на то, что вы обычно делаете в Windows Forms. Наконец, обработчик вызывает DataBind, Что всегда необходимо в ASP. NET 1.x и все еще требуется в ASP. NET 2.0, когда вы программно устанавливаете свойство DataSource. Весь этот код охвачен проверкой свойства страницы IsPostBack И, следовательно, будет исполнен только при первоначальном отображении страницы и не будет исполняться при отсылках.

В сетке предусмотрен выбор строк, реализуемый добавлением к ней столбца Button Column С текстом ссылки "Select", Как показано в листинге А. 1. Если щелкнуть на этой ссылке, код, отображаемый в браузере, заставляет форму отослать себя обратно на сервер с тем же адресом, причем она будет нести информацию, достаточную, чтобы сетка на стороне сервера могла определить, что была произведена обратная отсылка. Она будет знать индекс выбранной строки по параметрам отправления формы, которые генерируются из кода, выданного в браузер управляющим элементом сетки. Сетка также запустит событие с именем SelectedlndexChanged, А в классе кода поддержки страницы имеется подключенный к этому событию обработчик с именем OnSelectedlndex — Changed.

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

вы определяете шаблон специфицирующий содержание

Элемент управления FormView Обладает возможностями, во многом аналогичными DetailsView, Но позволяет вам определить шаблоны для всех аспектов его отображения, что дает значительную гибкость в управлении представлением одиночной строки данных или объекта. Вы определяете шаблон, специфицирующий содержание формы для каждой записи из привязанного источника данных. Содержание шаблона может включать в себя статическую разметку и выражения привязки, которые обеспечивают вывод строки или объекта из коллекции данных в предусмотренном вами формате. Следующий код дает простой пример элемента управления FormView С шаблоном ItemTemplate. Он показывает информацию о названии компании и телефоне для каждой записи данных из таблицы Customers, Которая привязывается к элементу управления: Если вы уже работали с элементами управления ASP. NET, то отношение FormView К DetailsView Может напоминать вам отношение элемента управления Repeater К DataList. DetailsView Имеет больше встроенных возможностей представления данных, но его содержание не так легко настраивать непосредственно. В противоположность этому FormView Более примитивен и не предусматривает почти никаких средств автоматического представления данных, но позволяет вам гораздо более гибко специфицировать способ представления и расположения данных на странице.

FormView Также поддерживает как редактирование и добавление новых записей, так и пагинацию. Эти возможности активируются аналогично тому, как это делается в других элементах управления — путем установки свойств или определения внутренних элементов разметки. В частности, если вы хотите поддерживать пагинацию, установите в True Свойство AllowPaging. Если требуется поддерживать редактирование и вставку, вы предусматриваете в качестве дочерних элементов тега FormView Дополнительные шаблоны в элементах EditTemplate И InsertTemplate.

Создание специального элемента управления который сам себя рисует

поскольку эта функция будет активироваться

Для начала вам нужно написать код, который будет заниматься графическим отображением столбиков для каждой строки. Поскольку эта функция будет активироваться многократно, для каждой из строк, и ее можно отделить от остального кода, который будет отвечать за привязку к коллекциям данных, предоставляющим эти строки, имеет смысл вынести функции отображения в самостоятельный элемент управления. Это будет специальный элемент управления, производный от базового класса Control, поскольку он отвечает за все рисование, производимое в его области клиента, с именем BarChartControl. Так как он не будет использоваться вне инкапсулирующего элемента управления , Который будет отображать экземпляры BarChartControl, Вы сделаете его класс внутренним в сборке CustomControis И не будете экспонировать его в окне Toolbox, откуда другие программисты могли бы помещать его непосредственно в свои формы. Код реализации BarChartControl Относится по большей части к рутинным геометрическим и графическим функциям отображения, в детали которых я здесь вдаваться не буду. Все детали вы можете увидеть, загрузив код образца CustomControis. Основной скелет класса BarChartControl Показан в Класс объявляется как внутренний, с установленным в False Атрибутом Toolboxltem, Что предотвращает его добавление в Toolbox, а то, что он помечен как Internal, Предотвращает его использование вне объявляющей сборки. Класс BarChartControl Является производным одновременно от базового класса Control И интерфейса IDisposable. Реализация интерфейса IDisposable необходима, поскольку в классе имеется элемент-переменная, содержащая объект Font, Который сам является уничтожаемым объектом. Чтобы обеспечить должную очистку объекта Font, Когда ваш элемент BarChartControl Будет больше не нужен его пользователям, вы должны освобождать этот объект при освобождении вашего элемента управления, за что и отвечают интерфейс IDisposable И методы завершения.

Свойство Cancel EventArgs. Cancel

прежде всего фокус ввода не

Когда вы в своем обработчике события Validating Устанавливаете свойство CancelEventArgs.Cancel В True, Происходит следующее. Прежде всего, фокус ввода не покинет этот элемент управления, заставляя пользователя исправить проблему, прежде чем он сможет перейти к вводу данных в другие элементы управления. Во многих ситуациях это неплохо, так как не дает пользователям уйти слишком далеко от того контекста, где они ошиблись во вводе, прежде чем они исправят ошибку. Это также предотвратит запуск события Validated, Поскольку процесс верификации не был завершен.

Однако при таком подходе возникает несколько проблем. Во-первых, вы, возможно, не всегда захотите заставлять пользователей исправлять свои ошибки немедленно; можно позволить им заполнить все поля формы и только потребовать, чтобы они решили любые возникшие проблемы перед тем, как послать или сохранить данные. Это позволит быстро вводить данные тем людям, которым целыми днями приходится заполнять одну и ту же форму. В таких случаях они, переходя от поля к полю, обычно не смотрят все время на форму и могут не увидеть, что из-за ошибки верификации фокусу не было разрешено перейти на следующий элемент управления. Другая проблема состоит в том, что если пользователи пытаются закрыть форму с ошибками верификации, которые обрабатывались посредством отмены события Validating, По умолчанию они не смогут этого сделать. Действие щелчка на другом элементе управления, например, на кнопках обрамления окна, вызывает переключение фокуса, что запускает верификацию, которая не удается и возвращает фокус обратно на элемент управления, где произошла ошибка. Наконец, этот подход требует, чтобы элемент управления сначала получил, а затем отдал фокус другому элементу управления, прежде чем будет активирован процесс верификации. К счастью, .NET 2.0 вводит в классе Form Свойство AutoValidate, Которое позволяет вам точно специфицировать, каким должно быть поведение в случае, когда ошибка верификации происходит на уровне элемента управления. Это свойство обсуждается позднее в этой главе.

Создание DataGridview с группировкой в столбцах

допустим например что у вас

В качестве примера специального элемента управления с привязкой к данным, созданного как производный класс от существующего элемента управления Framework, давайте создадим специализированную сетку DataGridview, Которая представляет привязанные данные в каждом столбце, группируя элементы данных. Допустим, например, что у вас есть таблица, содержащая сводную информацию по всем продуктам, заказывавшимся каждым клиентом, с указанием даты. Каждый клиент мог несколько раз заказывать один и тот же продукт, и мог размещать несколько различных заказов в один день. Если сортировать данные по клиентам и наименованиям продуктов, в сетке их будет проще читать, если не показывать в каждой строке одно и то же имя клиента или наименование продукта. Гораздо лучше показывать только новые значения, а строки с тем же значением, что и в предыдущей строке, представлять пустыми ячейками и показывать границы ячеек так, чтобы подчеркнуть группировку значений данных

Большинство подобных возможностей можно осуществлять применительно к отдельным случаям внутри форм, где вы используете элементы управления. Но нередко будет разумным инкапсуляция этой логики, чтобы либо отделить ее от остального кода формы, либо упаковать с целью последующей утилизации. Простейшим способом такой инкапсуляции является создание класса, производного от одного из классов элементов управления Windows Forms. Поскольку в данном случае специфицируется определенное поведение и изменяется вид данных в сетке, это хороший кандидат для получения субкласса элемента управления DataGridView. Реализация таких функций не требует написания больших объемов кода, а только переопределения некоторых методов базового класса и небольшого вмешательства в его поведение при форматировании и рисовании.