Статистика

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

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

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

Всегда важно понимать, что происходит на за кулисами привязки данных, но особенно это важно в случае, когда генерированный конструктором код делает не совсем то, что вы хотели. Прежде всего следует понять, что все элементы управления и компоненты, создаваемые в результате действий в конструкторе, вместе со всем вспомогательным кодом для настройки объектов привязки и свойств, являются частью автоматически генерируемого стандартного кода 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-файла во время выполнения, поэтому во время проектирования у конструктора нет достаточной информации, чтобы привязать первую таблицу, поэтому вы делаете это здесь программно.

Приложение Hello World

для этого вам потребуется создать

Давайте начнем с простого приложения WinFx «Hello World», не используя ничего, кроме кода. Для этого вам потребуется создать проект в Visual Studio 2005. Имеются типы проектов WinFx, которые добавляются в Visual Studio 2005 Beta 2 при установке Visual Studio Extensions for WinFx, так что вам нужно будет установить эти расширения, равно как и компоненты среды выполнения вместе с WinFx SDK.

Из этого простого приложения можно видеть, что прежде всего вам потребуется объект приложения. Вам нужно также главное окно, которое в простых сценариях можно создать как экземпляр класса Window.

В реальных приложениях вы обычно будете создавать экземпляр своего собственного класса, производного от Window Или одного их производных классов WinFx Framework, такого, как NavigationWindow. Окно, как и элементы управления, является элементом визуального дерева, поэтому вы модифицируете отображаемое содержимое окна путем установки его свойства Content. В данном случае установите в нем простую строку, а класс Window Сам способен отобразить ее за вас. В типичном случае вы образуете содержание UI окна, конструируя дерево из других элементов и устанавливая верхний объект этого дерева в качестве свойства Content Для окна. Как только вы установили для содержимого окна строку «Hello WinFx», вы показываете окно, вызывая его метод Show. Затем вы вызываете метод Run Объекта Application, Который организует цикл обработки событий, используемый Windows для коммуникации с запущенным приложением, точно так же, как это делается в сегодняшних приложениях WindowsForms. Обратите внимание на атрибут STAThread Для метода Main. В WinFx на Windows ХР он все еще необходим, так как WinFx заключает в оболочку некоторые из предоставляемых системой элементов управления, которые предназначены для выполнения в однопоточном разделе.

Интерфейс IListSource: экспонирование коллекций коллекций

вы можете инкапсулировать расположение и

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

Часто вам потребуется работать с коллекциями данных, которые связаны друг с другом. Наиболее частым случаем этого является работа с наборами данных в. NET. Набор данных можно рассматривать в качестве Коллекции коллекций, так как он может содержать набор таблиц. Каждая DataTable Является Коллекцией элементов данных, которыми являются строки данных . Вы можете также реализовать свой собственный специальный тип контейнера, который содержит другие коллекции, такой, как список списков. Или, возможно, ваш тип контейнера содержит единственный список, но вы хотите позволить потребителям использовать ваш объект как источник данных и получать из объекта список для целей привязки данных. Предположим, например, что у вас есть рабочий класс с именем InventoryManager, Который позволяет вам управлять позициями вашего инвентаря и получать к ним доступ для различных случаев применения. Допустим, вы захотите предоставить приложениям возможность привязки к вашему менеджеру инвентаря, причем менеджер контролировал бы, что будет экспонироваться для привязки данных, исходя из некоторого критерия, экспонируемого классом: У вас также мог бы быть контейнер с несколькими коллекциями, например, класс менеджера инвентаря, содержащий списки наличных позиций инвентаря, позиций, поставляемых по предварительному заказу, и поставщиков. В этом случае вы хотели бы предоставить потребителям простой способ получить список списков, которые содержит ваш объект. Интерфейс IListSource Поддерживает эти сценарии посредством двух своих элементов, описанных в 6. Он позволяет возвратить при вызове GetList Коллекцию по умолчанию . Этот список может быть либо простым списком объектов для привязки данных, либо списком списков, содержащихся в объекте. Если свойство ContainsListCollection Возвращает True, Предполагается, что список, возвращаемый GetList, Сам содержит списки.