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

Интерфейс lEditableObject: поддержка транзакционных модификаций элемента

потребляющий код может i b

Интерфейс LEditableObject Позволяет отложить фиксацию изменений свойств объекта до момента завершения процесса редактирования. Потребляющий код может Ушным Образом объявить, что на объекте начинается операция редактирования, а впоследствии принять либо отвергнуть изменения, сделанные в одном или нескольких свойствах объекта, прежде чем эти изменения станут видимы для другого кода, который может работать с этим объектом, оворя конкретнее, этот интерфейс позволяет, пока объект редактируется, отложить уведомление привязанных элементов управления об изменениях до момента, когда операция редактирования будет завершена вызовом EndEdit. Обычно вам может потребоваться реализовать этот интерфейс, если ваш объект имеет взаимосвязанные свойства или вам нужно верифицировать значения нескольких свойств, прежде чем можно будет сказать, что редактирование дало законное сочетание значений. Если вы разобрались в обсуждении интерфейса ICancelAddNew, То понять IEditableObject Будет несложно. Этот интерфейс позволяет поддерживать ту же транзакционную семантику на уровне индивидуального элемента данных. Если вы когда-нибудь редактировали таблицу данных, привязанную как к сетке, так и к другим элементам управления на форме, то вы видели этот интерфейс в действии. Когда вы изменяете в сетке значение столбца и затем переходите к другому столбцу, изменившееся значение не отражается в других привязанных элементах управления, пока фокус ввода не не покинет строку, которую вы редактируете. Если прежде перемещения фокуса вы нажимаете Esc, сделанные вами изменения откатываются и в отредактированные столбцы снова помещаются старые значения. Когда вы переводите фокус на другую строку, то в этот момент изменения редактируемой строки фиксируются, после чего другие элементы управления на форме будут обновлены, чтобы отразить новые значения. Это объясняется тем, что редактирование значения отдельного столбца рассматривается как часть единственной транзакции с объектом, и операции редактирования не считаются с точки зрения других элементов управления завершенными, пока операция не будет зафиксирована явно. Это происходит, когда вызывается метод EndEdit Объекта, либо сеткой при при смене текущей строки, либо вы явно вызываете его для фиксации изменений.

Привязка провайдера ошибок к источнику данных

класс b errorprovider b экспонирует

Вы можете также привязать провайдер ошибок к источнику данных и предоставить ему самому извлекать любую информацию об ошибках из источника данных. Класс ErrorProvider Экспонирует свойства DataSource И DataMember, При помощи которых его можно привязать к источнику данных таким же образом, как и другие привязанные элементы управления на форме. Если ошибка устанавливается через источник данных, и элементы данных в источнике реализуют интерфейс IDataErrorinfo , то провайдер ошибок будет показывать ошибки, как описано выше, для любых элементов управления, которые привязаны к элементам данных с ошибками в источнике данных. Вы можете сделать так вместо явного вызова SetError Провайдера ошибок в обработчике события Validating Для каждого элемента управления, если объекты в источнике данных поддерживают свою собственную информацию об ошибках. Однако при этом вам все равно может понадобиться предоставлять имеющиеся в источнике данных сообщения об ошибках, вызывая метод SetError Провайдера ошибок, если вы обнаруживаете в ваших формах определенные виды ошибок, так как источник данных не имеет контекстной информации о том, где и как он используется, в то время как коду вашей формы это известно.

Элемент управления DataGridview Требует особого подхода в отношении отображения информации об ошибках из-за сложности данных, которые он может показывать. Элемент управления DataGridview Имеет встроенную поддержку отображения информации об ошибках на уровне как строки, так и ячейки. Она работает очень просто. Точно так же, как при работе с провайдером ошибок на уровне формы, вы устанавливаете свойство ErrorText Строки или ячейки. Если свойство установлено, то в строке или ячейке будет отображаться значок, аналогичный значку провайдера ошибок, и всплывающая подсказка будет показывать установленный вами текст сообщения об ошибке. Обычно вы будете устанавливать только одно свойство из двух. Как можно видеть из рис. 10.4, значок появляется в ячейке заголовка строки, когда вы устанавливаете свойство ErrorText Строки, и в правой части ячейки, когда вы устанавливаете свойство ячейки.

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

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

Элемент управления 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 может получить посредством рефлексии.