4. Привязка объектов контроля к источникам данных

Запросы к XML-данным

например вам нужно будет выбрать

Когда ваши данные уже находятся в памяти в документе XML того или ИНОГО Вида , Вам, вероятно, потребуется выполнять к ним запросы, чтобы выбрать некоторое подмножество узлов, содержащихся в документе, на основании некоторого критерия, которому они должны отвечать. Например, вам нужно будет выбрать всех заказчиков из Калифорнии, получить данные по всем поставкам за последние шесть месяцев или выяснить скорость полета ласточки с полной загрузкой. Что бы вы ни хотели отыскать, в. NET для этого имеются простые и мощные способы выполнения запросов к XML-содержанию. Давайте сфокусируем внимание на одной методике запросов, которую поддерживают все типы документов: запросах XPathNavigator. Класс XPathNavigator Является внешним интерфейсом нижележащей машины запросов для любого из типов XML-документов в. NET. В предыдущем разделе вы видели пример, где вызывался метод SelectNodes Объекта XmlDocument. Это упрощенный метод для выбора узлов в действительности просто использует XPathNavigator. Класс XPathNavigator Реализует навигацию в наборе узлов по типу указателя, который вы можете использовать для итерации по документу. Он также экспонирует ряд методов выбора, которые позволяют исполнять запросы к содержимому документа или узла, на который он указывает. Этот раздел посвящен только запросам; следующий немного подробнее рассказывает о навигации. Чтобы получить XPathNavigator Для любого из типов XML-документов, вы вызываете метод CreateNavigator Документа или одного из его узлов. Метод возвращает экземпляр XPathNavigator С указателем, установленным на узел, из которого он был создан. Имея навигатор, вы вызываете один из методов запроса, показанных в таблице Г. 5, чтобы получить XPathNodelterator, Содержащий отвечающие запросу узлы.

Свойство Orders класса Customer

это может быть а может

Свойство Orders Класса Customer Опирается на элемент M Orders , Позволяя непосредственно обращаться ко всем заказам, относящимся к объекту заказчика. Это может быть, а может и не быть разумным в зависимости от того, как должны будут применяться ваши объекты. Если вы собираетесь использовать объекты Customer В различных контекстах, и в некоторых из этих контекстов заказы не будут важны или будут вне области действия, то наличие свойства Orders В классе Customer Можно рассматривать как загрязнение этого класса деталями, которые не всегда имеют отношение к делу. Однако если в вашем приложении имеется ряд случаев применения, где требуется производить итерацию по заказам, относящимся к заказчику, или требуется в целях отображения производить к ним привязку данных, то это, возможно, именно то, что вам нужно. Итак, что касается определений рабочих объектов и привязки данных, вас прежде всего интересуют экспонируемые ими свойства, которые представляют состояние или данные, содержащиеся в логической единице данных. Эти свойства могут представлять объекты с единственным значением, такие, как числа, строки или даты, либо представлять собой ссылки на другие логические единицы, с единственным или со многими значениями. Объект также может экспонировать любое число методов и событий, относящихся к встроенной логике, оперирующей состоянием объекта. Эти методы обычно не участвуют непосредственно в привязке данных этого объекта к UI, но могут так или иначе вовлекаться в нее. Свойства, экспонируемые классом, могут активировать любое число требуемых им функций в своих set-блоках — либо других методов класса, либо даже методов других объектов, которые сохраняются посредством переменных класса. Например, перед тем, как разрешить изменение значения свойства, вы могли бы в его set-блоке вызывать методы, проверяющие устанавливаемое значение по правилам верификации или рабочей логики. Кроме того, другие методы класса могут, вообще говоря, вызываться в любое время из любого места, и эти методы могут потенциально изменять состояние объекта, используемого для привязки данных.

Код конструктора и файлы источников данных

прежде всего следует понять что

Всегда важно понимать, что происходит на за кулисами привязки данных, но особенно это важно в случае, когда генерированный конструктором код делает не совсем то, что вы хотели. Прежде всего следует понять, что все элементы управления и компоненты, создаваемые в результате действий в конструкторе, вместе со всем вспомогательным кодом для настройки объектов привязки и свойств, являются частью автоматически генерируемого стандартного кода Windows Forms. В Visual Studio 2005 этот код размещается в отдельном файле с неполными классами, и этот файл по умолчанию не отображается в дереве проекта Solution Explorer. Чтобы увидеть код, генерированный в результате ваших манипуляций с конструктором, необходимо щелкнуть на значке рядом файлом класса формы в вашем проекте. Ниже вы увидите файл с именем вида <имя фор — мы>.Designer. cs, в котором и содержится весь генерированный конструктором код. Большая часть кода содержится внутри определения метода InitializeComponent. Еще одно действие, происходящее за кулисами, заключается в следующем: всякий раз, когда вы добавляете источник данных в проект извне, используя источники на базе Web-службы или объекта, в проект добавляется файл источника данных, обеспечивающий связь между информацией о типах для объекта или объектов в этом источнике и окном Data Sources Кроме того, если вы настраиваете отображение отдельных компонентов данных на элементы управления, выбирая в выпадающем списке другой тип элемента управления, Visual Studio должна где-то сохранять эту информацию, чтобы вам не пришлось повторять те же настройки в дальнейшем. Информация сохраняется как раз в этих файлах источников данных.

Привязка к рабочим объектам в окне Data Sources

образец custombusinessobjects на самом деле

Теперь, когда мы изучили весь процесс объявления рабочих объектов и коллекций, поддерживающих весь диапазон функций для привязки данных, давайте взглянем снова на простейший способ их использования в сценариях привязки данных при помощи окна Data Sources. Образец CustomBusinessObjects на самом деле объявляет классы Customer, Order, CustomerCollection И TestDataGenerator В Отдельной сборке библиотеки классов из проекта приложения Windows, который использовался для их тестирования. Чтобы показать, насколько просто использовать эти типы в привязке данных, давайте добавим к проекту CustomBusinessObjects — Client новую форму с именем Customers Form. Вы видите, что установить при помощи этих немногих операций привязку данных к специальным объектам и коллекциям не сложнее, чем организовать привязку к наборам данных. Однако вы видели также, что, безусловно, требуется масса работы для определения самих типов специальных объектов и коллекций таким образом, чтобы они правильно работали в сценарии привязки данных. В этой главе вы рассмотрели концепции, стоящие за определением и использованием специальных рабочих объектов для привязки данных в Windows Forms 2.0. По существу все сводится к поддержке разнообразных интерфейсов привязки данных на уровне объектов и коллекций. Вы узнали, как определять объекты, поддерживающие транзакционное редактирование и уведомления об изменении свойств, а также о различных видах коллекций, которые можно определять и использовать в сценариях привязки данных. Подводя итог, можно сказать, что для определения коллекций рабочих объектов, которые вы собираетесь использовать в привязке данных, следует предпочитать обобщенный тип BindingList<T> или производный от него класс. В зависимости от ваших потребностей вы, возможно, захотите также предусмотреть в своем производном классе коллекции реализации для сортировки, поиска и фильтрации.

Подключение обработчика события и привязка данных

а именно когда вы двойным

Хотя вы и работаете с двумя различными представлениями класса Forml, Видом Design и видом Code, вид Design в действительности является просто отражением кода, которое динамически поддерживает Visual Studio. А именно, когда вы двойным щелчком открываете исходный файл, содержащий определение класса формы, IDE видит, что класс, определенный в исходном файле, является производным от базового класса Form. Класс Form предусматривает специфическую поддержку для работы с ним в конструкторе, поэтому IDE, когда вы открываете файл, по умолчанию отображает вид Design класса. Вы можете переключиться в вид Code, либо щелкнув правой кнопкой где-нибудь внутри конструктора и выбрав в контекстном меню View Code, либо выбрав кнопку View Code в середине маленькой инструментальной панели в верхней части окна Solution Explorer, когда в дереве Solution Explorer выбран файл класса формы. Для переключения между видом Code и видом Design формы вы можете также воспользоваться клавишей F7. Чтобы прочитать данные из файла XML и привязать их к сетке, добавьте к методу Private Заметьте, что вам не нужно создавать экземпляр набора данных, как вы делали это в предыдущем примере, поскольку вы создали его как элемент, сбросив на форму в конструкторе. Когда вы сделали это, был также добавлен код для создания этого экземпляра. Но вы все равно устанавливаете привязку данных между сеткой и источником данных, устанавливая свойство Datasource сетки. В зависимости от того, каким образом вы создаете в конструкторе набор данных, у вас также может быть возможность установить эту привязку данных в конструкторе. В настоящем случае структура набора данных не определена до тех пор, пока набор данных не будет загружен из XML-файла во время выполнения, поэтому во время проектирования у конструктора нет достаточной информации, чтобы привязать первую таблицу, поэтому вы делаете это здесь программно.