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

Управление модификациями данных в сетке

после того как данные занесены

Элемент управления DataGridView Предоставляет вам явный контроль на тем, смогут ли пользователи редактировать, удалять или добавлять строки сетки. После того как данные занесены в сетку, пользователи могут взаимодействовать с представленными данными различными способами, что обсуждалось ранее. По умолчанию в число этих взаимодействий входят редактирование ячеек в строке, выбор строки и ее удаление клавишей Delete на клавиатуре, либо добавление новой строки, для чего используется пустая строка, отображаемая в качестве последней строки сетки.

Однако если вы собираетесь отслеживать изменения в источнике данных, то лучше будет следить за соответствующими событиями компонента BindingSource, А не подписываться на события самой сетки. Это особенно относится к случаю, когда код, используемый вами для обработки события, воздействует на другие элементы управления на форме. Поскольку везде, где это возможно, следует привязывать элементы управления не к самому источнику данных, а к источнику привязки, последний является наилучшим местом для отслеживания изменений в источнике данных. Если вы хотите запретить какие-либо из этих операций, установите в False Свойства AllowUserToAddRows Или AllowUserToDeleteRows, Либо установите в True Свойство Readonly Соответственно для добавления, удаления или редактирования. Каждое из этих свойств также возбуждает при установке своего значения соответствующее событие XXXChanged. Когда вы поддерживаете добавление, редактирование или удаление, вам может потребоваться обработка некоторых дополнительных событий для приема новых значений в несвязанных столбцах или при виртуальном режиме, как будет описано далее в этой главе.

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

добавьте для свойства 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 Дочерней формы ссылку на родительскую форму: