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

Источники привязки

я большой сторонник использования в

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

Можно сделать так, чтобы форма в качестве параметра своего конструктора получала ID клиента, извлекала необходимые данные, редактировала их, а затем записывала обратно в базу данных. Затем вам потребовалось бы по завершении диалога обновить главную форму, чтобы она отразила изменения в источнике данных. В зависимости от того, позволяет ли сама сетка редактировать данные, такой подход может породить проблемы конкуренции, даже если речь идет о единственном пользователе вашего приложения, и это, конечно, не лучший путь с точки зрения обмена с базой данных. На самом деле вам нужно, чтобы две раздельных формы работали с одним и тем же источником данных в памяти. Тогда вы сможете в качестве параметра передавать конструктору формы редактирования источник привязки, к которому она должна привязываться, получая его от формы-листинга, которая запускает редактирующую форму, как это проделано в следующем коде. В этой форме используется простая привязка между отдельными текстовыми полями и соответствующими компонентами в источнике данных через переданный форме источник привязки. Теперь при любых изменениях, вносимых в форму редактирования, они будут автоматически отражаться в исходных данных, поэтому сетка на форме, которая запускает форму редактирования, будет также синхронизована с этими данными. Все, что должна теперь делать кнопка Save, — это закрывать форму, при этом данные будут сохранятся в источнике данных на стороне клиента. Если вы хотите в этот момент зафиксировать изменения в базе данных, вы можете добавить код, выполняющий через уровень доступа к данным дополнительный вызов для сброса изменений в базу.

Краткий обзор архитектуры Windows Forms

а именно форма является классом

Прежде всего следует понимать, что форма является просто еще одной разновидностью типов. NET. А именно, форма является классом, который вы определяете как производный от базового класса System. Windows. Forms. Form. В свой производный класс вы можете включать элементы-переменные, свойства, методы и события, как в любом другом классе. NET. Вы будете, как правило, определять элементы класса для элементов управления, являющиеся по существу переменными, тип которых производится от базового класса Control и которые представляют элементы UI, отображаемые внутри формы. Эти элементы называют дочерними элементами управления, и они будут содержаться в коллекции, унаследованной от базового класса ContainerControl. На самом деле в Windows Forms Framework существует глубокая иерархия наследования, и многие функции, которые, как многие думают, обеспечиваются формой или элементом управления, в действительности наследуются от одного из многих базовых классов в этой иерархии. На рис. В.9 показана часть иерархии Windows Forms. Если вы имеете опыт работы с Visual Basic 6 или более ранними версиями, или с другими средами RAD, такими, как FoxPro или Delphi, на вас все это могло и не произвести особенного впечатления — пока. В конце концов, VB6 предлагает выдающиеся возможности для планировки и программирования простых форм, и именно оттуда взяты многие идеи среды времени проектирования в Visual Studio. Ключевым моментом, который следует усвоить относительно среды. NET — это то, что вы не теряете ничего в плане контроля или гибкости, модифицируя сделанное за вас конструктором. Взаимодействия в конструкторе просто генерируют код. NET, и вы можете просматривать и при необходимости модифицировать этот код, чтобы ваше приложение во время исполнения делало именно то, что от него требуется. Либо вы можете оставаться в конструкторе, где вы сможете сделать почти все, что вам нужно.

Обработчик 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 И методы завершения.