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

Извлечение данных при помощи сохраняемых процедур

сохраняемая процедура может быть просто

Когда вы работаете с сохраняемыми процедурами, часто бывает необходимо предоставить им параметры, которые повлияют на их исполнение. Сохраняемая процедура может быть просто оболочкой запроса, который будет возвращать строки данных, либо она может обновлять, добавлять или удалять данные в базе данных. В любом из этих случаев вы обычно должны сообщить сохраняемой процедуре, над какими данными она должна производить операции, и это делается посредством параметров. Давайте начнем с простого примера. В базе данных Northwind определена сохраняемая процедура с именем CustOrderHist. Вы предоставляете ей ID заказчика, и она возвратит результирующий набор, содержащий сводку продуктов и их количеств, заказанных этим заказчиком. Для вызова сохраняемых процедур в ADO. NET используется класс SqlCommand, как демонстрировалось выше. Однако вам нужно сообщить объекту команды, что вы вызываете сохраняемую процедуру, а не передаете текстовый запрос. Вы также должны предоставить объекту команды любые параметры, которые необходимо передать исполняемой процедуре. Как это делается, показывает листинг Г. 6. В данном случае вы создаете объект команды, специфицируя не строку запроса SQL, а имя сохраняемой процедуры, которую хотите вызвать, и устанавливаете свойство CommandType Команды равным StoredProcedure . Затем вам нужно создать объект SqlParameter , чтобы инкапсулировать каждый из параметров, необходимых сохраняемой процедуре, и добавить их к коллекции Parameters Команды. Как только все подготовлено, вы можете, как и раньше, вызвать метод Fill Адаптера данных, и он вызовет указанную сохраняемую процедуру, поместив результирующий набор в таблицу в наборе данных.

Функции Add Query

если вы хотите получить аналогичные

Функции Add Query доступны только для типизированных наборов данных, входящих в проект Windows Forms. Если вы хотите получить аналогичные функциональные возможности для набора данных, определенного в другой сборке, например, в сборке уровня доступа к данным, вам придется вручную добавить запрос в адаптер таблицы, вручную добавить Toolstrip И его элементы управления на форму и написать код, исполняющий запрос через метод адаптера таблицы и помещающий результаты в соответствующий источник привязки для формы. Иными словами, конструктор поможет вам только в том случае, когда вы следуете плохой методике проектирования и размещаете код доступа к данным внутри проекта Windows Forms. Вторым пунктом в нижней части контекстной закладки, отображаемым для каждого элемента управления или компонента, привязанного к типизированному набору данных в проекте Windows Forms, является Preview Data. При его выборе откроется диалог Preview Data, изображенный на рис. 5.23. Если щелкнуть на кнопке Preview в этом диалоге, будет исполнен соответствующий метод GetData Адаптера таблицы и в разделе Results будут отображены данные для предварительного просмотра. Элементы управления ComboBox И ListBox Снабжены контекстными закладками, которые можно использовать для установки их свойств привязки. Прежде всего необходимо пометить флажок Use Data Bound Items, после чего ниже появятся четыре комбинированных поля. Каждое из них позволяет вам открыть окно Data Sources, как описывалось ранее для свойств DataSource И DataMember В окне Properties.

Код XML

datasource содержит xml документ чей

Код XML представляет собой пример простого файла источника данных для Файл. datasource содержит XML-документ, чей корневой элемент называется GenericObjectDataSource. Это не зависит от того, создаете ли вы источник данных объектного типа или же источник типа Web-службы. Единственное различие здесь состоит в том, куда помещается файл. datasource в вашем проекте. Как видно из листинга, корневой элемент может содержать несколько атрибутов, сообщающих информацию о версии, имя источника для отображения в окне Data Sources и информацию о схеме, специфицирующую XML-файлы. datasource. Главное здесь то, что файл источника данных содержит элемент Typelnfo С полностью квалифицированным именем типа объекта, рассматриваемого в качестве источника данных верхнего уровня. В окне Data Sources он представляется корневым узлом дерева. Когда вы раскрываете дерево источника данных, дочерние объекты и свойства определяются окном Data Sources посредством рефлексии.

Помимо информации Typelnfo, Файл источника данных может содержать также информацию об отображении на элементы управления для тех элементов или компонентов данных, для которых отображение было изменено и отличается от установленного по умолчанию. В этом случае в корневой элемент документа добавляется элемент TypeUiSetting. Довольно сложная XML-схема, на которую опирается этот элемент, позволяет для каждого элемента или компонента данных со специальным отображением на элементы управления специфицировать информацию об этом отображении. Эта схема состоит из элемента-коллекции с именем PropertyUlsettings, Включающего в себя некоторое число элементов PropertyUlSetting. Для каждого компонента данных со специальным отображением на элементы управления специфицируется свой элемент PropertyUl Setting. Этот элемент содержит коллекцию настроек элементов управления и информацию о привязываемых элементах управления, которая устанавливает отображение:

Интерфейс lEnumerator

более конкретно интерфейс b ibindinglistview

Метод должен возвращать объект-перечислитель, реализующий интерфейс LEnumerator.

Интерфейс LEnumerator Имеет три элемента и работает подобно «логическому курсору» в коллекции данных. Он отправляется от позиции, установленной непосредственно перед первым элементом коллекции. Его использование начинается с вызова метода MoveNext Перечислителя, который позиционирует курсор на первый элемент, если таковой имеется, и возвращает True. Если коллекция пуста, первый вызов MoveNext Возвращает False. Последующие вызовы MoveNext Перемещают курсор на следующий логический элемент коллекции, пока в ней больше не останется элементов. Метод продолжает возвращать True, Пока курсор к моменту завершения вызова устанавливается на элемент коллекции. Когда элементов больше нет, MoveNext Возвращает False. Такая модель позволяет изящно и компактно организовать итерацию, поместив вызов MoveNext В цикл While. Порядок передвижения логического курсора определяется реализатором интерфейса LEnumerator И не обязан соответствовать физическому порядку следования элементов в коллекции. Например, если вы реализуете перечислитель для сортируемой коллекции, вы захотите, чтобы курсор перемещался в соответствии с порядком сортировки. Однако если вы собираетесь поддерживать сортировку, вам придется также позаботиться о реализации интерфейса IBindingList. К итерируемым элементам вы обращаетесь через свойство Current. Это свойство интерфейса LEnumerator Возвращает ссылку типа Object, Которая должна указывать на текущий элемент коллекции в позиции логического курсора. Интерфейс LEnumerator Включает также метод Reset, Возвращающий курсор к его начальной позиции, позволяя вам произвести повторную итерацию по той же коллекции, используя тот же самый перечислитель. Следующий фрагмент кода показывает типичный цикл, использующий интерфейсы Обобщенная коллекция List<T> Реализует интерфейс LEnumerable , Поэтому код посредством неявного приведения получает ссылку на интерфейс LEnumerable Коллекции. Затем он вызывает через эту интерфейсную ссылку метод GetEnumerator, Который возвращает интерфейсную ссылку типа LEnumerator. Имея перечислитель, вы на его методе MoveNext Организуете цикл While.

Добавление функций интерфейса IBindingListView

более конкретно интерфейс b ibindinglistview

Если вы помните из главы 7, существует уровень функциональных возможностей привязки данных, определяемый интерфейсом IBindingListView, Который вы можете поддерживать, чтобы сделать свои коллекции еще богаче. Более конкретно, интерфейс IBindingListView Вводит возможности сортировки более чем по одному свойству и фильтрации по некоторому выражению фильтра, которая позволяет показывать одновременно только часть нижележащей коллекции. Интерфейс IBindingListView Определяет четыре дополнительных свойства и два метода, которые вам нужно реализовать для полной поддержки интерфейса. Булевы свойства SupportsAdvancedSorting И SupportsFiltering Указывают, какие из двух возможностей вы поддерживаете. Свойство SortDescriptions Возвращает коллекцию ListSortDescriptionCoilection, Которая содержит любые критерии сортировки, действительные в настоящий момент. Каждый объект ListSortDescrip — Tion В коллекции является просто парой, ассоциирующей PropertyDescriptor И ListSortDirection Для каждого из свойств, к которым применяется сортировка. Свойство Filter Поддерживает установку и получение строки выражения фильтра, которую вы используете для настройки того содержания коллекции, которое представляется любому использующему коллекцию. Метод ApplySort Аналогичен тому, что определен в интерфейсе IBindingList, Но принимает параметр ListSortDescriptionCoilection Вместо одиночных PropertyDescriptor И ListSortDirection. Каждый ListSortDescription В этой коллекции содержит дескриптор свойства и направление сортировки, что позволяет сортировать по каждому критерию по очереди. Метод RemoveFilter Удаляет любой действующий в настоящий момент фильтр и восстанавливает коллекцию в ее полном содержании.

Хотя это звучит как нечто самоочевидное, реализация этого интерфейса дело нетривиальное. Сортировку по нескольким свойствам реализовать на самом деле довольно просто, но это требует некоторых расширений класса SortComparer<T> И логики сортировки, представленных ранее. Фильтрация может выполняться различными способами, но еще более усложняет положение дел, если вы хотите разрешить добавления и удаления из коллекции, пока она находится в фильтрованном состоянии. Будучи фильтрованной, ваша коллекция в принципе может еще и сортироваться, так что вы должны быть способны вернуться к исходному, возможно, модифицированному списку от сортированного/нефильтрованного, фильтрованного/несортированного и фильтрованного/сортированного состояний.