2. Работа с наборами типизированных данных

Сортировка, поиск и фильтрация представляемых данных при помощи источника привязки

чтобы сортировка через источник привязки

Если источник данных, привязанный к источнику привязки, реализует интерфейс IBindingList Или IBindingListView , то вы можете выполнять сортировку, поиск и фильтрацию данных посредством источника привязки. Чтобы сортировка через источник привязки была возможна, реализация интерфейса IBindingList В источнике данных должна возвращать True В свойстве IBindingList. Sup — PortsSorting. Если это так, вы можете поместить сортирующее выражение в свойство Sort, И представляемые источником привязки данные будут автоматически сортироваться. При этом не требуется какой-либо поддержки сортировки в элементах управления, привязанных к данному источнику привязки. В следующем примере задается выражение сортировки для источника привязки, привязанному к CustomersDataTable. В этом коде сетка привязана к источнику привязки. Источник привязки, в свою очередь, привязан к экземпляру CustomersDataTable, Возвращаемому адаптером таблицы. Затем свойство Sort Источника привязки устанавливается равным "ContactName ASC", В результате чего данные из таблицы сортируются по возрастанию значений в столбце ContactName. Сетка отображает уже сортированные данные, поскольку получает их в таком виде от источника привязки, вне зависимости от порядка данных в таблице. Синтаксис критерия сортировки требует указать сначала имя свойства, по которому производится сортировка, а затем AS С Для восходящего или DESC Для нисходящего порядка. Если направление сортировки не задано, по умолчанию принимается восходящий порядок.

Источники данных могут использовать эту усовершенствованную форму сортировки посредством интерфейса IBindingListView. Если источник данных реализует этот интерфейс и возвращает True В свойстве IBindingListView. SupportsAdvancedSorting, Вы можете передавать в свойстве Sort Более сложные выражения сортировки с несколькими критериями. Это позволяет сортировать по нескольким столбцам таблицы или свойствам коллекции. Например, для CustomersDataTable Вы можете передать выражение сортировки "Region ASC, CompanyName DESC". Тогда сортировка будет выполняться сначала по столбцу Region В восходящем порядке, а затем, для строк с одинаковыми значениями для Region, По значениям CompanyName В нисходящем порядке.

Динамическое заполнение комбинированного поля

b такая возможность стала поддерживаться

Чтобы динамически заполнить элемент управления ComboBox Именами полей или свойств в элементах коллекции источника данных, добавьте в класс FilteredGrid Вспомогательный метод, показанный в

Первое, что делает вспомогательный метод, это проверяет ваш флаг Reinitializing, Устанавливаемый реализацией интерфейса ISupportlnitialize, Выясняя, не был ли этот метод вызван, пока вы находитесь в стадии инициализации. В этом случае метод просто возвращает управление, ничего больше не делая, поскольку предполагается, что инициализация самого источника данных может быть еще не завершена.

Затем при помощи обобщенного типа List Создается список строк для сохранения имен полей по ходу их раскрытия. Источник привязки экспонирует свойство List, Которое обеспечивает непосредственный доступ к любому списку объектов, содержащемуся в нем в качестве источника данных. Можно было бы просто обратиться к свойству DataSource Источника привязки, то тогда вам пришлось бы вручную разрешить компонент данных внутри этого источника данных. Использование свойства List Сразу дает непосредственный доступ к развернутой коллекции данных, которая возвращает ссылку на IList. Затем, если список содержит какие-то элементы, метод обращается к первому элементу в коллекции. Источники привязки поддерживают только списки, содержащие гомогенную коллекцию, поэтому первый элемент должен дать вам всю необходимую информацию. После этого метод получает коллекцию дескрипторов для свойств первого элемента в списке и организует цикл, проходящий по этим дескрипторам. Код проверяет каждый дескриптор свойства на предмет того, не реализует ли само представляемое им свойство интерфейс IList, Используя его свойство PropertyType, Которое возвращает экземпляр объекта Туре, Описывающий действительный тип свойства. Для выяснения того, не представляет ли свойство дочернюю коллекцию, код вызывает метод Getlnterface Экземпляра Туре. В этом случае он не добавляет это свойство в список. Тем самым обеспечивается защита в двух возможных сценариях. Если вы имеете дело с источником данных, который является набором данных с таблицами, имеющими отношения между собой, в дескрипторах свойств эти отношения будут проявляться как свойства.

Интерфейс IBindingListView: поддержка расширенной сортировки и фильтрации

i как было описано в

Интерфейс IBindingListView Дополняет возможности привязки данных интерфейса IBindingList, Вводя поддержку сортировки по набору свойств и фильтрации списка. Как было описано в предыдущем разделе, интерфейс IBindingList Обеспечивает простые функции сортировки и поиска. Однако иногда вам требуются дополнительные функциональные возможности. Вам может потребоваться сортировать коллекцию одновременно по нескольким свойствам или столбцам, или фильтровать представляемые коллекцией элементы по некоторому критерию, не отыскивая соответствующие ему элементы по одному. Интерфейс IBindingListView Предназначен как раз для таких случаев. IBindingListView Является производным от IBindingList, Так что все сказанное об IBindingList И его базовых интерфейсах остается в силе и здесь. Свойства и методы IBindingListView Описываются в Для поддержки расширенной сортировки коллекция должна быть способна устанавливать порядок исходя одновременно из нескольких свойств своих объектов данных. Перед попыткой применения расширенной сортировки код клиента должен проверить, истинно ли свойство SupportsAdvan — CedSorting. Если это так, то критерии сортировки специфицируются путем конструирования коллекции объектов ListSortDescription, Которая передается методу ApplySort Интерфейса IBindingListView. Тип ListSortDescription Весьма прост: это просто контейнер для пары, состоящей из свойства PropertyDescriptor И свойства SortDirection. Как правило, порядок этих элементов в ListSortDescriptionCoilection Определяет порядок, в котором применяются критерии сортировки. Чтобы удалить применявшуюся ранее сортировку, просто вызовите метод RemoveSort, Унаследованный от базового класса IBindingList. Чтобы получить доступ к текущим описаниям сортировки, применяемым к коллекции, можно проверить свойство IsSorted Базового интерфейса, после чего обратиться к свойству SortDescriptions, Чтобы получить коллекцию элементов ListSortDesc — Ription, Используемых в данный момент Если коллекция поддерживает фильтрацию, она должна возвращать True В свойстве SupportsFiltering. Тогда при помощи свойства Filter Вы можете установить строку фильтра, что немедленно изменит объекты данных, экспонируемые коллекцией при ее итерации. Формат строки фильтра будет относиться к разряду деталей реализации, отдельно специфицируемых для коллекции каждого типа.

Отслеживание данных при помощи событий

в таблице показаны события имеющиеся

Еще одна важная возможность сценариев привязки данных, особенно когда имеет место развязка уровней, состоит в оповещении об изменениях в нижележащем источнике данных при помощи событий. В таблице показаны события, имеющиеся в BindingSource. Такие события, как PositionChanged, ListChanged И CurrentChanged, Вы можете использовать для управления привязкой данных или синхронизации других элементов управления на форме, которые не обязательно находятся в строгих родительско-дочерних отношениях, которые допускали бы управление посредством каскадирования источников привязки, как было описано ранее. Например, представьте, что на форме имеется привязанный к данным комбинированный список, и при выборе в нем нового значения требуется переключить на новый источник данных — другой источник привязки, который управляет привязкой другой группы элементов управления на форме. Допустим, комбинированный список содержит строки соединения или имена баз данных. Вы можете решить эту проблему при помощи события SelectedlndexChanged Комбинированного списка. Но что, если на форме имеется несколько элементов управления, которые могут изменить текущий источник данных? Благодаря событию CurrentChanged Источника привязки вы можете очень просто решить проблему на уровне источника привязки, вместо того чтобы решать ее на уровне элементов управления.

Вы можете также использовать эти события для синхронизации между коллекциями данных, которые не связаны отношением «ведущий-детализация». Это иллюстрируется листингом 4.7 , где событие CurrentChanged Обновляет отображение родительского элемента при выборе в коллекции дочерних объектов. Событие CurrentChanged Можно еще использовать для организации своего рода связи «ведущий-детализация» между коллекциями объектов, связанных отношением «многие-ко-многим», как будет показано далее в разделе «Синхронизация коллекций, связанных отношением многие-ко-многим» .

Несколько более сложное приложение

допустим вы строите приложение winfx

Приложение «Hello World» не особенно продвинет вас вперед в понимании объектной модели WinFx и того, как образуется приложение, поэтому давайте взглянем на чуть более сложный пример. Допустим, вы строите приложение WinFx, которое будет производить идентификацию и авторизацию для определения того, что разрешено пользователю, исходя из сведений о нем в специальной базе данных и известных ролей. Итак, вам нужно идентифицировать пользователя, так что потребуется окно для входа в приложение. Давайте закодируем окно WinFx, которое будет выглядеть, как показанный на рис. Б.1 примитивный диалог авторизации. Сначала код создает объект Window Для главного окна и устанавливает его свойства width, Height И Text. Ничего загадочного здесь не происходит; код напоминает тот, что записывает в свой файл кода конструктор Windows Forms для каждой создаваемой вами формы.

Затем создаются следующие элементы управления: Grid, Два Text — Block, Один TextBox, Один PasswordBox И Button. Каждый экземпляр создается с помощью конструктора по умолчанию, после чего устанавливаются некоторые свойства. Для элементов TextBlock В свойстве Text — Content Устанавливаются строки подсказки, ради которых они здесь и присутствуют — здесь они используются аналогично элементам управления Label В Windows Forms. Для свойств HorizontalAlignment И Vertical Alignment Устанавливается значение Center, чтобы элементы были правильно выровнены на форме. Для TextBox, PasswordBox И Button Устанавливается свойство Height; Для Button В свойстве Content Устанавливается строка, которая будет отображаться на поверхности кнопки, аналогично тому, как это было со свойством Text Элемента управления Button В Windows Forms.