Поделиться через


Интерфейсы, относящиеся к связыванию данных

Обновлен: Ноябрь 2007

C помощью ADO.NET можно создать несколько различных структур данных, удовлетворяющих требованиям привязки приложений и обрабатываемых данных. Чтобы предоставлять или использовать данные в Windows Forms, может потребоваться создать собственные классы. Эти объекты могут различаться уровнями функциональных возможностей и сложностью и обеспечивать как простую привязку данных, так и поддержку времени разработки, проверку ошибок, уведомление об изменениях или даже поддержку структурированного отката изменений, внесенных непосредственно в данные.

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

В следующих разделах описываются две группы объектов интерфейса. В первую группу входят интерфейсы, которые реализованы на основе источников данных авторами источников данных. Эти интерфейсы предназначены для использования потребителями источников данных, которые в большинстве случаев являются элементами управления или компонентами Windows Forms. Вторая группа интерфейсов предназначена для использования авторами компонентов. Авторы компонентов используют эти интерфейсы при создании компонентов, поддерживающих привязку данных, которая должна использоваться ядром привязки данных Windows Forms. Эти интерфейсы реализуются в классах, связанных с соответствующей формой, для включения привязки данных; каждый вариант представляет класс, в котором реализуется интерфейс, обеспечивающий взаимодействие данных. Преимущества этих функциональных возможностей уже поддерживаются средствами разработки данных в среде быстрой разработки приложений (RAD) Visual Studio.

Дополнительные сведения о реализации интерфейсов см. в разделах Зарезервированное слово Implements и оператор Implements (Visual Basic) и interface (Справочник по C#) (ключевое слово C#).

Интерфейсы, предназначенные для реализации авторами источников данных

Перечисленные ниже интерфейсы предназначены для использования элементами управления Windows Forms.

  • Интерфейс IList

    Интерфейс IList можно реализовать в классе Array, ArrayList или CollectionBase. Эти классы представляют собой индексированные списки типа Object. Указанные списки должны содержать однородные типы, поскольку тип определяется первым элементом индекса. Интерфейс IList будет доступен для привязки только во время выполнения.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Если требуется создать список бизнес-объектов для привязки с элементами управления Windows Forms, следует использовать интерфейс BindingList<T>. BindingList<T> представляет собой расширяемый класс, реализующий интерфейсы для двусторонней привязки данных Windows Forms.

  • Интерфейс IBindingList

    Класс, реализующий интерфейс IBindingList, обеспечивает более высокий уровень возможностей привязки данных. Реализация этого интерфейса предоставляет основные возможности сортировки и поддерживает уведомления об изменениях, касающихся элементов списка (например, обновилось поле "Адрес" третьего элемента в списке заказчиков) или связанных с самим списком (например, увеличилось или уменьшилось количество элементов списка). Уведомления об изменениях становятся особенно важными, если планируется привязать к одним данным несколько элементов управления и необходимо распространить изменения данных, выполненные в одном элементе управления, на все другие связанные элементы управления.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Уведомления об изменениях включаются для интерфейса IBindingList посредством свойства SupportsChangeNotification. Если это свойство принимает значение true, инициируется событие ListChanged, которое означает, что изменен список или элемент списка.

    Тип изменения описывается свойством ListChangedType параметра ListChangedEventArgs. Поэтому при любом обновлении модели данных все зависимые представления, например другие элементы управления, привязанные к тем же данным, также будут обновлены. Однако для того, чтобы список вызвал событие ListChanged, объекты списка должны будут уведомить список при изменении.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Класс BindingList<T> предоставляет общую реализацию интерфейса IBindingList.

  • Интерфейс IBindingListView

    Класс, реализующий интерфейс IBindingListView, предоставляет все возможности реализации интерфейса IBindingList, а также обеспечивает функции фильтрации и расширенной сортировки. Эта реализация предлагает фильтрацию на основе строк и сортировку по нескольким столбцам, использующую пары свойств "дескриптор-направление".

  • Интерфейс IEditableObject

    Класс, реализующий интерфейс IEditableObject, позволяет объектам определять, являются ли изменения, произведенные в этих объектах, окончательными. Благодаря этой реализации можно использовать методы BeginEdit, EndEdit и CancelEdit, которые обеспечивают возможность отката изменений объекта. Ниже представлено краткое объяснение работы методов BeginEdit, EndEdit и CancelEdit, а также описано их взаимодействие при обеспечении возможности отката изменений данных.

    • Метод BeginEdit сигнализирует о начале изменения объекта. Объект, реализующий этот интерфейс, должен сохранить все обновления, внесенные после вызова метода BeginEdit таким образом, чтобы они могли быть отменены при вызове метода CancelEdit. В Windows Forms, где используется привязка данных, можно вызывать метод BeginEdit несколько раз в пределах одной транзакции изменения (например, BeginEdit, BeginEdit, EndEdit). Реализации интерфейса IEditableObject должны отслеживать вызов метода BeginEdit и игнорировать последующие вызовы этого метода. Так как этот метод можно вызывать несколько раз, важно, чтобы последующие вызовы были безопасными; к примеру, повторные вызовы метода BeginEdit не могут отменить внесенные обновления или изменить данные, которые были сохранены при первом вызове метода BeginEdit.

    • Метод EndEdit записывает все изменения, внесенные после вызова метода BeginEdit, в основной объект, если он находится в режиме редактирования.

    • Метод CancelEdit отменяет все изменения, внесенные в объект.

    Дополнительные сведения о работе методов BeginEdit, EndEdit и CancelEdit см. в разделе Общие сведения о сохранении данных.

    Такое транзакционное представление функциональных возможностей данных используется элементом управления DataGridView.

  • Интерфейс ICancelAddNew

    Класс, реализующий интерфейс ICancelAddNew, обычно реализует интерфейс IBindingList и позволяет выполнить откат добавлений к источнику данных, сделанных с помощью метода AddNew. Если источник данных реализует интерфейс IBindingList, он также должен реализовать интерфейс ICancelAddNew.

  • Интерфейс IDataErrorInfo

    Класс, реализующий интерфейс IDataErrorInfo, позволяет объектам предоставлять связанным элементам управления специализированные сведения об ошибках.

    • Свойство Error возвращает общее сообщение об ошибке (например, "Произошла ошибка").

    • Свойство Item возвращает строку с конкретным сообщением об ошибке из столбца (например, "Недопустимое значение в столбце State ").

  • Интерфейс IEnumerable

    Класс, реализующий интерфейс IEnumerable, обычно используется в ASP.NET. Для поддержки этого интерфейса в Windows Forms должен присутствовать компонент BindingSource.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Компонент BindingSource копирует все элементы IEnumerable в отдельный список, предназначенный исключительно для привязки.

  • Интерфейс ITypedList

    Класс "Collections", реализующий интерфейс ITypedList, позволяет управлять порядком и набором свойств, доступных связанному элементу управления.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Если при реализации метода GetItemProperties массив PropertyDescriptor не является нулевым, последняя запись этого массива является дескриптором свойства, который описывает свойство списка, являющееся другим списком элементов.

  • Интерфейс ICustomTypeDescriptor

    Класс, реализующий интерфейс ICustomTypeDescriptor, предоставляет динамические сведения о себе. Этот интерфейс подобен интерфейсу ITypedList, однако он используется не для списков, а для объектов. Данный интерфейс используется объектом DataRowView для применения схемы основных строк. Простая реализация интерфейса ICustomTypeDescriptor предоставляется классом CustomTypeDescriptor.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Для поддержки привязки времени разработки для типов, реализующих интерфейс ICustomTypeDescriptor, эти типы должны также реализовать интерфейс IComponent и существовать в качестве экземпляра для формы.

  • Интерфейс IListSource

    Класс, реализующий интерфейс IListSource, обеспечивает привязку на основе списка для объектов, не являющихся списками. Метод GetList интерфейса IListSource используется для возвращения связываемого списка из объекта, который не наследуется от интерфейса IList. Интерфейс IListSource используется классом DataSet.

  • Интерфейс IRaiseItemChangedEvents

    Класс, реализующий интерфейс IRaiseItemChangedEvents, представляет собой связываемый список, который также реализует интерфейс IBindingList. Этот интерфейс используется для определения, вызывает ли данный тип событие ListChanged типа ItemChanged посредством своего свойства RaisesItemChangedEvents.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Интерфейс IRaiseItemChangedEvents следует реализовать, только если источник данных обеспечивает описанное ранее преобразование свойства в список и взаимодействует с компонентом BindingSource. В противном случае, интерфейс BindingSource также будет выполнять преобразование свойства в список, что приведет к снижению производительности.

  • Интерфейс ISupportInitialize

    Компонент, реализующий интерфейс ISupportInitialize, использует преимущества пакетной оптимизации для задания свойств и инициализации взаимозависимых свойств. Интерфейс ISupportInitialize содержит два метода, перечисленных ниже.

    • BeginInit подает сигнал о начале инициализации объекта.

    • EndInit подает сигнал об окончании инициализации объекта.

  • Интерфейс ISupportInitializeNotification

    Компонент, реализующий интерфейс ISupportInitializeNotification, также реализует интерфейс ISupportInitialize. Этот интерфейс позволяет уведомлять другие компоненты ISupportInitialize о завершении инициализации. Интерфейс ISupportInitializeNotification содержит два метода, перечисленных ниже.

    • Метод IsInitialized возвращает boolean значение, указывающее, инициализирован ли компонент.

    • Событие Initialized возникает при вызове метода EndInit.

  • Интерфейс INotifyPropertyChanged

    Класс, реализующий этот интерфейс, является типом, который вызывает событие при изменении значений его свойств. Данный интерфейс может использоваться вместо вызова отдельного события изменения для каждого свойства элемента управления. При использовании в классе BindingList<T> бизнес-объект должен реализовывать интерфейс INotifyPropertyChanged; при этом класс "BindingList`1" будет преобразовывать события PropertyChanged в события ListChanged типа ItemChanged.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Для уведомления об изменениях, возникающих в привязке между связанным клиентом и источником данных, связанный тип источника данных должен реализовывать интерфейс INotifyPropertyChanged (рекомендуется). Можно также предоставить для связанного типа события propertyNameChanged, однако не следует выполнять обоих действий одновременно.

Интерфейсы, предназначенные для реализации авторами компонентов

Перечисленные ниже интерфейсы предназначены для использования ядром привязки данных Windows Forms.

  • Интерфейс IBindableComponent

    Класс, реализующий этот интерфейс, представляет собой поддерживающий привязку данных компонент, который не является элементом управления. Этот класс возвращает привязки данных и контекст привязки компонента посредством свойств DataBindings и BindingContext данного интерфейса.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Если данный компонент наследуется от элемента Control, интерфейс IBindableComponent реализовывать не требуется.

  • Интерфейс ICurrencyManagerProvider

    Класс, реализующий интерфейс ICurrencyManagerProvider, является компонентом, который предоставляет собственный класс CurrencyManager для управления привязками, связанными с данным конкретным компонентом. Доступ к пользовательскому классу CurrencyManager предоставляется посредством свойства CurrencyManager.

    41e17s4b.alert_note(ru-ru,VS.90).gifПримечание.

    Класс, который наследуется от элемента Control, управляет привязками автоматически посредством своего свойства BindingContext, поэтому реализовывать интерфейс ICurrencyManagerProvider требуется лишь в редких случаях.

См. также

Задачи

Практическое руководство. Создание элемента управления с простой привязкой в форме Windows Forms

Основные понятия

Связывание данных и Windows Forms

Другие ресурсы

Связывание элементов управления Windows Forms с данными