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

Перехват добавлений и удалений

вам нужно позаботиться также о

Для перехвата добавлений и удалений вам нужно переопределить еще некоторые методы базового класса BindingList<T>, Такие, как Insertltem, Removeltem И Clearltems, И обеспечить выполнение одних тех же изменений как в первичной, так и в несортированной коллекции. Вам нужно позаботиться также о транзакционных добавлениях к коллекции, поэтому потребуется переопределение EndNew И CancelNew, А также транзакционное удаление из несортированной коллекции. Как видите, все усложняется весьма быстро. Чтобы продемонстрировать базовые возможности сортировки, давайте не будем поддерживать добавление и удаление элементов, когда коллекция сортирована. Вам все равно потребуется сделать копию существующей коллекции перед применением сортировки и возвратиться к этой копии, когда сортировка отменяется, но вам не нужно будет беспокоиться о добавляемых или удаляемых элементах и о поддержке параллельной коллекции, когда коллекция сортирована. Как уже упоминалось, класс List<T> Имеет встроенную возможность сортировки, и вы можете воспользоваться ей для выполнения действительной сортировки. Класс производит сортировку, исходя из обобщенной реализации интерфейса Icomparer<T>, Которую вы передаете методу. Для реализации этого интерфейса вы создаете класс с методом Compare, Который сравнивает объекты типа т и возвращает целое, показывающее, равен ли первый объект второму, больше он или меньше второго объекта. Какой критерий вы используете для решения о том, какое значение возвращать, определяется вами и вашей реализацией интерфейса. Реализация в листинге 9.4 использует идеи, взятые из рубрики Майкла Вайнхардта «Wonders of Windows Forms» в «MSDN Online», которые сами восходят к более ранней статье Рокки Лотка. Я выбрал другую стратегию реализации и добавил возможность сортировки по нескольким свойствам, которая показана далее в обсуждении реализации интерфейса IBindingListView, но некоторые основные детали следующей реализации были взяты из серии статей Майкла «Custom Data Binding» в зимних выпусках 2004 года.

Интерфейс 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 Экземпляра провайдера ошибок на форме. Этот метод принимает два аргумента: ссылку на элемент управления, для которого вы устанавливаете ошибку, и сообщение об ошибке.