Обзор привязки данных (Windows Forms .NET)

В Windows Forms можно выполнить привязку не только к традиционным источникам данных, но и к практически к любой структуре, содержащий данные. Можно выполнить привязку к массиву значений, который рассчитывается во время выполнения, считывается из файла или является производным от значений других элементов управления.

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

  • Задание рисунка для элемента управления изображения.

  • Задание цвета фона для одного или нескольких элементов управления.

  • Задание размера элементов управления.

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

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

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

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

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

Элементы управления Windows Forms реализуют следующие интерфейсы:

  • IList Интерфейс

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

    Примечание.

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

  • IBindingList Интерфейс

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

    Примечание.

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

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

    Примечание.

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

  • IBindingListView Интерфейс

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

  • IEditableObject Интерфейс

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

    • Метод BeginEdit передает сигнал о начале внесения изменения в объект. Объект, реализующий этот интерфейс, должен будет сохранять все обновления после вызова метода BeginEdit, чтобы их можно было отменить в случае вызова метода CancelEdit. При привязке данных в Windows Forms метод BeginEdit можно вызвать несколько раз в области одиночной транзакции изменения (например, BeginEdit, BeginEdit, EndEdit). Реализации IEditableObject должны следить за тем, был ли уже вызван метод BeginEdit, и игнорировать последующие вызовы в 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.

    Примечание.

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

  • ITypedList Интерфейс

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

    Примечание.

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

  • ICustomTypeDescriptor Интерфейс

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

    Примечание.

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

  • IListSource Интерфейс

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

  • IRaiseItemChangedEvents Интерфейс

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

    Примечание.

    Вы должны реализовать 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.

    Примечание.

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

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

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

  • IBindableComponent Интерфейс

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

    Примечание.

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

  • ICurrencyManagerProvider Интерфейс

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

    Примечание.

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

Источники данных, поддерживаемые Windows Forms

Как правило, привязка данных использовалась в приложениях с целью использования преимуществ данных, хранящихся в базах данных. При привязке данных Windows Forms можно получить доступ к данным из баз данных и данных в других структурах, таких как массивы и коллекции, до тех пор, пока выполнены определенные минимальные требования.

Структуры для привязки к

В Windows Forms можно выполнить привязку к самым разным структурам — от простых объектов (простая привязка) до сложных списков, таких как таблицы данных ADO.NET (сложная привязка). Для простой привязки Windows Forms поддерживает привязку к общедоступным свойствам простого объекта. Привязка на основе списка Windows Forms обычно требует, чтобы объект поддерживал IList интерфейс или IListSource интерфейс. Кроме того, при привязке с помощью BindingSource компонента можно привязать к объекту, который поддерживает IEnumerable интерфейс.

В следующем списке представлены структуры, к которым можно выполнить привязку в Windows Forms.

  • BindingSource

    BindingSource — наиболее распространенный источник данных Windows Forms; выступает в роли прокси-сервера между источником данных и элементами управления Windows Forms. Общий шаблон использования BindingSource — привязка элементов управления к BindingSource и привязка BindingSource к источнику данных (например, к таблице данных ADO.NET или бизнес-объекту). BindingSource предоставляет службы, которые обеспечивают и улучшают уровень поддержки привязки данных. Например, элементы управления на основе списка Windows Forms, такие как DataGridView и ComboBox не поддерживают прямую привязку к IEnumerable источникам данных, однако можно включить этот сценарий, привязав его с помощью привязки BindingSource. В этом случае BindingSource преобразует источник данных в IList.

  • Простые объекты

    Windows Forms поддерживает свойства элемента управления привязкой данных к общедоступным свойствам экземпляра объекта с помощью Binding типа. Windows Forms также поддерживает элементы управления на основе списка привязок, например ListControl экземпляр объекта при BindingSource использовании.

  • Массив или коллекция

    Чтобы выступать в роли источника данных, список должен реализовывать интерфейс IList; один из примеров — массив, который является экземпляром класса Array. Дополнительные сведения о массивах см. в статье Практическое руководство. Создание массива объектов (Visual Basic).

    Как правило, при создании списков объектов для привязки данных следует использовать BindingList<T>. BindingList — это универсальная версия интерфейса IBindingList. Интерфейс IBindingList расширяет интерфейс IList путем добавления свойств, методов и событий, необходимых для двусторонней привязки данных.

  • IEnumerable

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

  • Объекты данных ADO.NET

    ADO.NET предоставляет множество структур данных, подходящих для привязки. Они отличаются сложностью.

    • DataColumn

      Это основной стандартный DataTableблок , DataColumn в том, что несколько столбцов составляют таблицу. У каждого DataColumn есть свойство DataType, определяющее тип данных, которые хранятся в столбце (например, создание автомобиля в таблице, описывающей автомобили). Можно выполнить простую привязку элемента управления (например, свойства Text элемента управления TextBox) к столбцу в таблице данных.

    • DataTable

      DataTable — это представление таблицы со строками и столбцами в ADO.NET. Таблица данных содержит две коллекции: DataColumn представляет столбцы данных в заданной таблице (это в конечном итоге определяет типы данных, которые можно вносить в таблицу), а DataRow — строки данных в заданной таблице. Можно выполнить сложную привязку элемента управления к сведениям, содержащимся в таблице данных (например, привязку элемента управления DataGridView к таблице данных). Однако при привязке к представлению DataTableтаблицы по умолчанию выполняется привязка.

    • DataView

      DataView — это настраиваемое представление отдельной таблицы данных, которое можно отфильтровать или отсортировать. Представление данных — это "моментальный снимок" данных, используемый элементами управления со сложной привязкой. Вы можете легко привязать или выполнить сложную привязку к данным в представлении данных, но обратите внимание, что вы привязываетесь к фиксированному "рисунку" данных, а не к чистому, обновляемого источника данных.

    • DataSet

      DataSet — это коллекция таблиц, отношений и ограничений данных в базе данных. Вы можете просто привязать или выполнить сложную привязку к данным в наборе данных, но обратите внимание, что вы привязываетесь к умолчанию DataViewManager ( DataSet см. следующую точку маркера).

    • DataViewManager

      DataViewManager — это настраиваемое представление всего DataSet, аналогичное DataView, однако включающее отношения. С помощью коллекции DataViewSettings можно задавать фильтры по умолчанию и параметры сортировки для всех представлений, имеющихся в DataViewManager для данной таблицы.

Типы привязки данных

В Windows Forms можно использовать преимущества двух типов привязки данных: простой и сложной. Каждая имеет собственные преимущества.

Тип привязки данных Description
Простая привязка данных Возможность привязки элемента управления к одному элементу данных, например к значению в столбце таблицы набора данных. Простая привязка данных — это тип привязки, типичный для элементов управления, таких как TextBox элемент управления или Label элемент управления, которые обычно отображают только одно значение. По сути, любое свойство в элементе управления можно привязать к полю в базе данных. В Visual Studio существует обширная поддержка этой функции.

Дополнительные сведения см. в статье "Навигация по данным" и создание простого элемента управления (Windows Forms .NET).
Сложная привязка данных Возможность привязки элемента управления к нескольким элементам данных, обычно к нескольким записям в базе данных. Сложная привязка также называется привязкой на основе списка. Примеры элементов управления, которые поддерживают сложную привязку, — DataGridView, ListBox и ComboBox. Пример сложной привязки данных см. в разделе Практическое руководство. Связывание элемента управления ComboBox или ListBox с данными в Windows Forms.

Компонент источника привязки

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

Распространенные сценарии, использующие привязку данных

Практически каждое коммерческое приложение использует сведения, полученные из источников данных разных типов. Обычно это осуществляется через привязку данных. В следующем списке приведено несколько наиболее распространенных сценариев, в которых привязка данных используется в качестве метода представления данных и управления ими.

Сценарий Description
Отчетность Отчеты — это гибкий инструмент отображения и сводного представления данных в печатном документе. Обычно создается отчет, который выводит выбранное содержимое источника данных на экран или на принтер. Традиционные формы отчетов — списки, счета и сводки. Элементы форматируются в столбцы списков с вложенными элементами, упорядоченными по каждому элементу списка, но следует выбрать макет, который лучше всего подходит для данных.
Ввод данных Распространенным способом ввода больших объемов связанных данных или отправки пользователям запросов на предоставление сведений является использование формы для ввода данных. Пользователи могут вводить сведения или выбирать варианты, используя текстовые поля, переключатели, флажки и раскрывающиеся списки. Затем данные отправляются на хранение в базу данных, структура которой основана на введенных данных.
Отношение "Основной/подробности" Приложение "Основной/подробности" — это еще один способ просмотра связанных данных. В частности, существует две таблицы данных с отношением, соединяющимся в классическом бизнес-примере, таблице "Клиенты" и таблицей "Заказы" с связью между клиентами и соответствующими заказами. Дополнительные сведения о создании приложения "Основной/подробности" с двумя элементами управления DataGridView Windows Forms см. в разделе Практическое руководство. Отображение главного и подчиненного представлений данных с использованием двух элементов управления DataGridView в Windows Forms.
Таблица уточняющих запросов Другим распространенным сценарием представления данных и работы с ними является использование таблицы подстановок. Являясь частью крупной структуры представления данных, элемент управления ComboBox применяется для отображения данных и управления ими. Смысл заключается в том, что данные, отображаемые в элементе управления ComboBox, отличаются от данных, которые записываются в базу данных. Например, если есть элемент управления ComboBox, отображающий позиции товара в продуктовом магазине, возможно, вы захотите увидеть названия товаров (хлеб, молоко, яйца). Однако чтобы упростить получение сведений из базы данных и нормализовать базу данных, вы, вероятно, сохраните данные по конкретным позициям для определенного заказа виде кодов (501, 603 и т. д.). Таким образом, существует неявное соединение между "понятным именем" элемента продуктов в элементе управления в ComboBox форме и соответствующим номером элемента, который присутствует в заказе. Это суть подстановки таблицы. Дополнительные сведения см. в разделе Практическое руководство. Создание таблицы подстановок с помощью компонента BindingSource в формах Windows Forms.

См. также