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

Элементы управления окна которые объявляются в качестве дочерних

b в данном случае самым

Создаются элементы управления окна, которые объявляются в качестве дочерних под элементом Window. В данном случае самым внешним элементом является панель StackPanel, Которая содержит окно списка и сетку с метками и текстовыми полями для имени заказчика и телефона. Как видите, для установки свойств в создаваемых экземплярах элементов управления вы просто добавляете атрибуты к их XAML-элементам. Для задания планировки сетки в качестве ее дочерних элементов специфицируются элементы ColumnDefinition И RowDefinition, А затем в нужных строках и столбцах сетки размещаются в элементы управления, которые объявляются как дочерние элементы сетки и к их тегам добавляются атрибуты Grid.Row И Grid.Column. Обратите также внимание на операторы привязки для поля списка и двух текстовых полей. Поле списка устанавливает в своем свойстве ItemsSource Просто значение {Binding}. Эта специальная синтаксическая форма XAML по существу создает экземпляр по умолчанию объекта Binding, Устанавливая в качестве привязанного источника текущий контекст данных. Операторы привязки для текстовых полей почти такие же, за исключением того, что для создаваемого объекта Binding Задается свойство Path, специфицирующее имя соответствующего компонента в объектах контекста данных.

Код поддержки для окна находится в файле Windowl. xaml. cs и содержит конструктор по умолчанию, вызывающий метод InitializeCompo — Nent, И обработчик для события Loaded С именем WindowLoaded. В отличие от Windows Forms здесь нет файла кода конструктора Visual Studio, который содержал бы InitializeComponent. Вместо этого данный метод и другой код, соответствующий разметке XAML, генерируется на ходу, уже в процессе компиляции. Однако InitializeComponent Нужно еще вызвать, так как именно в нем после компиляции будет находиться весь код для установки свойств, специфицированных в файле XAML. Реализация класса Windowl Выглядит следующим образом:

Отображение ошибок верификации при помощи ErrorProvider

хотя это работает на большинство

В примере обработки события Validating В начале этой главы я воспользовался примитивным подходом с отображением панели сообщения при возникновении ошибки верификации. Хотя это работает, на большинство пользователей крайне отрицательно действует применение всплывающих диалогов для подобных целей. В Windows Forms 1.0 был включен элемент управления ErrorProvider, Предлагающий стандартный и менее бесцеремонный способ уведомления пользователя об ошибке. Провайдер ошибок Относится к элементам управления специального вида, называемым провайдерами расширений, которые позволяют добавлять свойства к любому другому элементу управления на форме из единственного экземпляра провайдера расширений. Когда вы используете элемент управления провайдера ошибок, вам нужно просто добавить на форму один его экземпляр, и он будет показан в лотке невизуальных компонентов в нижней части конструктора. Провайдер ошибок хранит карту сообщений об ошибках, ассоциированных с каждым элементом управления на форме. Если вы устанавливаете для элемента управления сообщение об ошибке, которое не является нулем или пустой строкой, провайдер расширения ошибок будет рисовать рядом с этим элементом значок ошибки и будет также показывать всплывающую подсказку, если вы задержите мышь на этом значке, как показано на рис. 10.3. Сообщение об ошибке для элемента управления вы устанавливаете, вызывая метод SetError Экземпляра провайдера ошибок на форме. Этот метод принимает два аргумента: ссылку на элемент управления, для которого вы устанавливаете ошибку, и сообщение об ошибке.

Поддержка отложенной инициализации при помощи ISupportlnitialize

он несколько схож с интерфейсом

На данном этапе вам нужно еще реализовать интерфейс ISupportlnitialize, Определенный в пространстве имен System.ComponentModel. Этот интерфейс, обсуждавшийся в главе 7, позволяет отложить некоторые шаги инициализации, пока не будут инициализированы все взаимосвязанные свойства вашего элемента управления, устанавливаемые в конструкторе, после чего они вступают в силу одновременно. Он несколько схож с интерфейсом IDisposable В том, что когда вы создаете класс, содержащий уничтожаемые объекты, вы должны сделать сам класс уничтожаемым и делегировать вызовы его метода Dispose Инкапсулированным объектам. Если ваш элемент управления содержит объекты, которые могут инициализироваться, вы должны сделать его инициализируемым и делегировать инициализацию инкапсулированным объектам. Для этого добавьте к вашему определению класса интерфейс ISupportlnitialize И предусмотрите в классе реализацию всех методов интерфейса, делегируя их вызовы реализациям источника привязки и сетки: Это позволит вам контролировать порядок инициализации элементов управления, а также даст возможность контролировать при необходимости свою собственную пакетную инициализацию. Я добавил еще в класс булев флаг Reinitializing. Его можно использовать в качестве сигнала для ваших методов, показывающего, что вы находитесь в процессе инициализации, что нам вскоре пригодится. Я решил также сначала завершать инициализацию источника привязки, а затем сетки, что имеет свой смысл: источник данных сетки должен быть инициализирован прежде, чем сетка попытается завершить свой процесс привязки к этому источнику данных размещенный на форме. Конструктор должен создать за вас на форме несколько объектов: экземпляр набора данных с именем CustomersDataSet, Источник привязки с именем CustomersBindingSource И адаптер таблицы с именем CustomersTableAdapter. Он также соответствующим образом подключит их, установит свойства Datasource И DataMember Вашего элемента управления для работы с генерированными объектами данных, и добавит строчку кода в обработчик события Load Формы, чтобы заполнить набор данных при помощи адаптера.

Если вы сейчас запустите приложение, то должны увидеть сетку, заполненную данными.

Метод Fill адаптера данных

сначала он проверяет не открыто

Я вызываю метод Fill Адаптера данных, который выполняет несколько действий. Сначала он проверяет, не открыто ли уже соединение в нижележащем объекте команды. Если нет, метод Fill Откроет соединение. Затем он исполняет запрос к базе данных. После этого адаптер принимает возвращаемые строки, проверяет, существует ли уже в наборе данных DataTable С требуемой схемой, и если нет, создает ее, а затем помещает в нее возвращаемые строки. Если адаптер данных открывал соединение, перед возвратом из вызова метода он закроет его. Если при заполнении набора данных вы не специфицируете имя таблицы, именем экземпляра таблицы данных будет просто Table, и по мере добавления дополнительных таблиц они будут названы Tablet, ТаЫе2 и т. д. Рис. Г. З показывает весь стек, используемый в типичном случае для работы с наборами данных и реляционными хранилищами данных. Обычно запрос или сохраняемая процедура будет возвращать только одну таблицу результатов, но вы могли бы возвратить одним запросом или сохраняемой процедурой сразу несколько таблиц, как показано в листинге Г.4. таблицы результатов, и набор данных заполняется двумя таблицами, одной для Customers и одной для Orders. Свойство TableName Каждой из результирующих таблиц устанавливается затем соответствующей строкой, поскольку в соответствии с соглашением по умолчанию они были бы названы Table и Tablet. Обратите также внимание на другой синтаксис при создании объектов в этом методе. Вместо спецификации различных параметров для каждого из объектов в его конструкторе здесь они передаются через свойства уже после конструирования.

Привязка элементов управления к источникам данных

в этой главе мы продолжим

В предыдущей главе было представлено введение в привязку данных Windows Forms и сделан краткий обзор компонента BindingSource, обеспечивающего более свободное связывание источников данных с элементами управления. В этой главе мы продолжим изучение вопросов привязки данных и рассмотрим многочисленные примеры привязки элементов управления Windows Forms, что поможет вам справляться даже с самыми сложными сценариями привязки на практике. В данной главе освещаются программные методы работы с компонентом BindingSource. Затем в главе 5 будет показана работа с окном источников данных и конструктором Windows Forms, которые в значительной мере автоматизируют процесс кодирования в типичных сценариях. Компонент BindingSource разрешает ряд каверзных проблем, которые возникали при непосредственной привязке источников данных к элементам управления, что имело место в. NET 1.x. Он образует промежуточный уровень между источником данных и привязанными элементами управления, что упрощает решение ряда задач. Кроме того, он открывает важные точки управления и доступ к нижележащему источнику данных, что избавляет вас от погружения в механизмы привязки данных формы, без чего нельзя было обойтись в прошлом. Источник привязки также дает вам, с точки зрения формы, единый интерфейс для программирования и позволяет сделать большую часть кода формы развязанной от конкретного типа источника данных. Благодаря этому вам не придется приспосабливать свой код к каждому из используемых приложением источников данных, будь то наборы данных, внешние источники, пользовательские рабочие объекты, массивы или что-то еще. Компонент BindingSource предоставляет обширный набор событий, к которым ваш код может подключаться для отклика на изменения в скрытых за ним данных, производимых другими элементами управления или каким-то кодом в вашем приложении. В этой главе мы шаг за шагом изучим все эти возможности.