5. Общее представление об интерфейсах привязки данных

Поддержка инициализации привязки данных в конструкторе

добавьте для свойства b datasource

Если вы хотите, чтобы ваши свойства DataSource И DataMember Вели себя так же, как свойства встроенных элементов управления Windows Forms, позволяя выбирать источники и компоненты данных при помощи графических всплывающих окон, обеспечивающих просмотр источников данных в проекте, как описано в главе 5, нужно снабдить эти свойства некоторыми атрибутами, которые позволят конструктору узнать, как с ними обращаться. Добавьте для свойства DataSource Атрибут AttributeProvider, А для свойства DataMember — атрибут Editor С соответствующими аргументами. Это сообщит конструктору, что с этими свойствами следует обращаться точно так же, как со свойствами DataSource И DataMember Встроенных элементов управления Windows Forms. Если бы вы попытались установить привязку данных не программно, а в конструкторе Visual Studio, то столкнулись бы с определенными проблемами. Во-первых, если вы попробуете перетащить таблицу Customers из окна Data Sources, то увидите, что конструктор не считает элемент управления FilteredGrid Допустимым приемником для такой операции. Во-вторых, если вы перейдете в окно Properties, когда в конструкторе выбран FilteredGrid, Вы увидите экспонированные там свойства DataSource И DataMember, Но DataSource Будет затенено, поскольку оно объявлено просто как объектная ссылка, и у конструктора недостаточно информации, чтобы предоставить вам возможность выбрать что-то в качестве источника данных. Просто добавив эти атрибуты и построив заново библиотеку элемента управления, вы при работе с FilteredGrid В конструкторе получаете те же самые функции привязки посредством перетаскивания, что и с DataGridview, ComboBox И любыми другими привязанными к данным элементами управления из Framework, как показано на рис. 8.7. Чтобы увидеть изменения в окне Properties, вам после перестройки решения может потребоваться закрыть и снова открыть форму, на которой вы редактируете FilteredGrid

Файлы источников данных представляют собой XML-файлы

если источник данных относится к

Файлы источников данных представляют собой XML-файлы, добавляемые в различные места в проекте, в зависимости от характера источника данных, для которого вы настраиваете отображение на пользовательский интерфейс. Если источник данных относится к объектному типу, файлы источника данных создаются в подпапке DataSources папки Properties вашего проекта Visual Studio. Имена файлов образуются из пространства имен и типа объекта источника данных, и они имеют расширение. datasource. Если источником данных является Web-служба, файлы. datasource помещаются в подпапку папки Web References, которая создается для кода агента этой Web-службы. Если источник данных — определение типизированного набора данных, входящего в ваш проект, генерируется. xsc-файл, который ассоциируется с определением схемы, определяющей этот набор данных. Для получения доступа к информации об источниках данных, опирающихся на Web-службы, выберите кнопку Show All Files, разверните узел Web reference, найдите элемент Reference.Тар, и вы увидите дочерние элементы в поддереве этой ссылки. Помимо файла Reference. cs, который содержит прокси-класс для обращения к Web-службе, вы найдете здесь также ряд файлов. datasource для каждого из типов, возвращаемых методами этой службы. Эти типы могут быть сложными и содержать дочерние коллекции объектов и компоненты данных, но файлы источников данных генерируются только для объектных типов верхнего уровня, определенных в качестве возвращаемых значений методов Web-службы. Сами определения типов добавляются в файл Reference. cs, где размещается прокси-класс. Всю остальную информацию о типах дочерних объектов окно Data Sources может получить посредством рефлексии.

Спецификация свойств привязки для элемента управления

для идентификации этих свойств специального

Если вы хотите, чтобы конструктор позволял устанавливать привязки данных для вашего элемента управления посредством операций перетаскивания, он должен знать, предназначен ли ваш элемент управления для простой или для сложной привязки, и какие его свойства следует устанавливать в ответ на эти операции. Для идентификации этих свойств специального элемента управления вы должны добавить соответствующий атрибут к определению его класса, чтобы окно Data Sources могло с ним работать. Используемые для этого атрибуты описаны в таблице 8.1. Таким образом вы получаете требуемые интерактивные функции в окне Properties, но при попытке перетащить источник данных из окна Data Sources курсор мыши все еще будет указывать на недопустимость такой операции. Чтобы это исправить, нужно добавить соответствующий атрибут привязки к самому классу.FilteredGndl CustomControts.FiiteredGrid Поскольку FilteredGrid Представляет собой элемент управления со сложной привязкой, Два параметра в конструкторе этого атрибута специфицируют имена свойств для установки соответственно источника данных и компонента данных элемента управления. Я рекомендую придерживаться обычного соглашения об их наименовании , Как сделано и в элементе управления FilteredGrid. Теперь можно перетаскивать источники данных из окна Data Sources на элемент управления, при этом конструктор генерирует все необходимые объекты и соответствующим образом подключит их к вашим свойствам Datasource И DataMember.

Заключение форм внутрь родительской формы

а что если вы хотите

В предыдущем разделе было показано, как запустить новую форму, которую можено перемещать по экрану независимо тот формы, из которой она была запущена, хотя период жизни этого окна и привязан к тому окну, которое его создало. А что, если вы хотите создать форму, которая была бы полностью заключена внутри области клиента ее родительского окна? Такой стиль пользовательского интерфейса называется многодокументным интерфейсом, даже если то, что содержится в дочерних формах, может быть вообще не ориентировано на документы. Эта терминология является пережитком, оставшимся от тех времен, когда ранние версии программ вроде Microsoft Word или Excel открывали каждый документ в дочернем окне, которое содержалось внутри внешнего окна, или обрамления, представлявшего собственно приложение. Большинство этих программ сместило свою ориентацию от центрированной на приложении к более центрированной на документе, и теперь отображают для каждого открытого документа отдельное окно верхнего уровня. Тем не менее введенный ими стиль приложений еще встречается и во многих ситуациях вполне оправдан. Создание MDI-приложений в Windows Forms намного проще, чем это было в C++ или VB6. Прежде всего вам нужно спроектировать вашу главную форму, как вы это сделали бы для любого другого приложения. Так как вы разрабатываете приложение MDI, вам нужно будет оставить область клиента главной формы пустой, так как именно там будут отображаться дочерние формы. Обычно в главной форме MDI-приложения у вас будет только меню, инструментальная панель и строка состояния. Вам нужно будет спроектировать также любые формы, которые вы хотите заключить в область клиента главной формы в качестве дочерних форм.

Как только вы спроектируете формы, останется сделать всего два шага, чтобы запустить дочерние формы таким образом, что они будут заключены внутри области клиента родительской формы. Прежде всего вам нужно установить свойство IsMdiContainer Родительской формы в True. Затем, когда вы конструируете дочерние формы, но до того, как вы вызовете их метод Show, Вы должны установить в свойстве MdiParent Дочерней формы ссылку на родительскую форму:

Создание коллекций и объектов, поддерживающих весь спектр привязки данных

я большой сторонник использования в

Создание коллекций и объектов, поддерживающих весь спектр привязки данных, требует массы работы. Я большой сторонник использования в качестве контейнеров для рабочих данных типизированных наборов данных, а не специально определенных объектов, когда их предполагается применять в сценариях привязки данных. Одним из главных доводов в их пользу является то, что набор данных и содержащиеся в нем объекты уже все делают за вас, хорошо проверенным и апробированным образом. В частности, классы Dataview и Data — Rowview предусматривают полную реализацию всех рассмотренных интерфейсов, они будут отлично работать почти с любыми видами данных, которые вам потребуется в них поместить. Если вы передаете данные на уровень представления для привязки данных, вашим первым побуждением должно быть применение для них в качестве контейнера набора данных вместо того, чтобы в интересах объектно-ориентированной чистоты проделывать всю массу работы по корректной реализации объектов и коллекций, которая обеспечит всего лишь их пригодность для привязки данных. Вот некоторые ключевые выдержки из этой главы: Класс DataSet И содержащиеся в нем объекты уже делают за вас все необходимое, поэтому везде, где это возможно, используйте типизированные наборы данных, чтобы не создавать заново все те контейнерные функции, которые уже за вас написаны. Для сильно типизированных классов коллекций, поддерживающих привязку данных, предпочтительнее использовать BindingList<T>. Создавайте классы, производные от BindingList<T>, Чтобы добавить поддержку для сортировки, поиска и фильтрации. Добавьте реализацию INotifyPropertyChanged, Чтобы поддерживать уведомления ListChanged От коллекции BindingList<T>, Когда изменяются значения свойств. Следующая глава заканчивает рассмотрение концепций, стоящих за созданием привязанных к данным приложений Windows Forms, обсуждением верификации и обработки ошибок — двух ключевых моментов построения развитых и надежных приложений, работающих с данными, которые делают именно то, что ожидает от них пользователь. В ней обсуждаются встроенные механизмы верификации и обработки ошибок в элементах управления Windows Forms, а также то, как дополнить имеющиеся функции, чтобы не писать всякий раз один и тот же код верификации и обработки ошибок