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

Интерфейс ICurrencyManagerProvider: экспонирование контейнером объекта CurrencyManager

этот интерфейс реализуется компонентом i

Интерфейс ICurrencyManagerProvider Позволяет контейнеру указать, предусмотрен ли в нем свой собственный синхронизатор CurrencyManager Для любых коллекций данных в его содержимом. Этот интерфейс реализуется компонентом BindingSource, И вам не придется реализовывать его самостоятельно. Однако иногда вам может потребоваться обращение к этому интерфейсу, чтобы получить доступ к синхронизатору контейнера из привязанного элемента управления.

Интерфейс ICurrencyManagerProvider Имеет два элемента: метод с именем GetRelatedCurrencyManager И Свойство С Именем CurrencyManager. Вы будете пользоваться главным образом свойством CurrencyManager, Чтобы получить ссылку на нижележащий синхронизатор и подписаться на его уведомления об изменениях. Метод GetRelatedCurrencyManager Позволяет специфицировать параметр компонента данных, чтобы получить синхронизатор дочерней коллекции в сценарии ведущий-детализация. В этой главе были охвачены все основные интерфейсы привязки данных, которые вам может потребоваться реализовывать либо потреблять. Я показывал их, подходя к ним с точки зрения контракта, представляемого интерфейсом, после чего описывал интерфейс более подробно, отправляясь от его элементов. Для описания и демонстрации наиболее сложных концепций я привел несколько примеров, а также описывал некоторые моменты в плане реализации и использования интерфейсов, как они присутствуют в уже знакомых вам элементах управления и коллекциях. NET Framework, таких, как DataView И DataGridView. Существует еще несколько интерфейсов, работающих за кулисами, таких, как IBindableCompo — Nent, Реализуемый в Windows Forms базовым классом Control. Но поскольку вам не придется в действительности иметь дело непосредственно с ними, я не стал вдаваться в их детали. Вот некоторые ключевые выдержки из этой главы: Минимальным требованием к коллекции данных является реализация интерфейса IList, Который позволяет привязать коллекцию непосредственно к элементу управления. Компонент BindingSource Может производить итерацию по коллекции, которая реализует только LEnumerable, И добавлять ее элементы к своей собственной внутренней коллекции-списку, поэтому для поддержки привязки через BindingSource Достаточно интерфейса LEnumerable.

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

net был b datagrid b

Вероятно, самым распространенным элементом управления в привязанных к данным приложениях ASP. NET до появления ASP. NET 2.0 был DataGrid, Позволяющий представлять табличные данные. Как и элемент управления DataGrid В Windows Forms, DataGrid В ASP. NET было удобно использовать в простых сценариях, но в случае более сложных он оставлял желать много лучшего. Поэтому разработчики ASP. NET пошли по тому же пути, что и команда разработчиков Windows Client — вместо того, чтобы «исправлять» или улучшать существующий элемент управления, поддерживая при этом обратную совместимость, они решили совсем его заменить. В результате появился GridView.

В простых сценариях элемент управления GridView Функционирует во многом аналогично DataGrid. Вы устанавливаете для него источник данных, как-то стилизуете, и когда происходит привязка к данным, элементы привязанной коллекции отображаются в качестве строк HTML-таблицы, где каждый столбец или свойство в источнике данных выводится в отдельном столбце строки. Однако возможности Gridview Простираются гораздо дальше и делают как обычные, так и более сложные сценарии намного проще. Например, как упоминалось ранее, для поддержки редактирования, выбора, сортировки и пагинации элемент DataGrid Требовал при обратных отсылках обработки событий, которые были не настолько просты или очевидны, чтобы разобраться в них с первой попытки. В элементе Gridview Вы просто устанавливаете свойство элемента управления, указывая, что он должен поддерживать одну или несколько из этих функций, а элемент сам об этом позаботится. Для самых распространенных сценариев вся обработка отсылок инкапсулирована, но события все равно возбуждаются, позволяя вам единообразно обрабатывать особые ситуации. Улучшены возможности стилизации сетки, как и возможность применения шаблонов для специального содержимого ячеек.

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

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 Формы, чтобы заполнить набор данных при помощи адаптера.

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