Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В Windows Forms можно привязать не только к традиционным источникам данных, но и к почти любой структуре, содержащей данные. Можно привязать к массиву значений, которые вычисляются в момент выполнения, читаются из файла или выводятся из значений других элементов управления.
Кроме того, можно привязать любое свойство любого элемента управления к источнику данных. В традиционной привязке данных обычно привязывается свойство отображения (например, свойство Text элемента управления TextBox) к источнику данных. При использовании .NET также можно задать другие свойства с помощью привязки. Вы можете использовать привязку для выполнения следующих задач:
Настройка графики элемента управления изображением.
Задание цвета фона одного или нескольких элементов управления.
Установка размера элементов управления.
По сути, привязка данных — это автоматический способ настройки любого свойства доступности во время выполнения любого элемента управления в форме.
Интерфейсы, связанные с привязкой данных
ADO.NET позволяет создавать множество различных структур данных, чтобы соответствовать потребностям привязки приложения и данным, с которыми вы работаете. Вам может потребоваться создать собственные классы, которые предоставляют или используют данные в Windows Forms. Эти объекты могут предложить различные уровни функциональности и сложности. От базовой привязки данных до поддержки на этапе разработки, проверки ошибок, уведомления об изменениях и даже до структурированной поддержки отката изменений, внесенных в данные.
Потребители интерфейсов привязки данных
В следующих разделах описаны две группы объектов интерфейса. Первая группа интерфейса реализована в источниках данных авторами источников данных. Потребители источников данных, такие как элементы управления или компоненты Windows Forms, реализуют эти интерфейсы. Вторая группа интерфейса предназначена для использования авторами компонентов. Авторы компонентов используют эти интерфейсы при создании компонента, который поддерживает привязку данных для использования подсистемой привязки данных Windows Forms. Эти интерфейсы можно реализовать в классах, связанных с формой, чтобы включить привязку данных. Каждый случай представляет класс, реализующий интерфейс, обеспечивающий взаимодействие с данными. Средства разработки данных Visual Studio для быстрого разработки приложений (RAD) уже используют эту функцию.
Интерфейсы для реализации авторами источников данных
Элементы управления Windows Forms реализуют следующие интерфейсы:
интерфейс IList
Класс, реализующий IList интерфейс, может быть классом Arrayили ArrayListCollectionBase. Это индексированные списки элементов типа Object , а списки должны содержать однородные типы, так как первый элемент индекса определяет тип.
IList
будет доступно для привязки только во время выполнения программы.Замечание
Если вы хотите создать список бизнес-объектов для привязки в Windows Forms, следует рассмотреть использование BindingList<T>. Это
BindingList
расширяемый класс, реализующий основные интерфейсы, необходимые для двусторонней привязки данных Windows Forms.интерфейс IBindingList
Класс, реализующий IBindingList интерфейс, обеспечивает гораздо более высокий уровень функциональности привязки данных. Эта реализация предоставляет базовые возможности сортировки и уведомления об изменениях. Оба варианта полезны при изменении элементов списка, а также при изменении самого списка. Уведомление об изменении важно, если вы планируете связать несколько элементов управления с одинаковыми данными. Это помогает вносить изменения данных, сделанные в одном из элементов управления, чтобы распространять их на другие связанные элементы управления.
Замечание
Уведомление об изменении включено для IBindingList интерфейса через SupportsChangeNotification свойство, которое, когда
true
вызывает ListChanged событие, указывающее, что список изменен или элемент в списке изменен.Тип изменения описывается свойством ListChangedTypeListChangedEventArgs параметра. Поэтому при обновлении модели данных все зависимые представления, такие как другие элементы управления, привязанные к тому же источнику данных, также будут обновлены. Однако объекты, содержащиеся в списке, должны извещать список, когда они изменяются, чтобы этот список смог вызвать ListChanged событие.
Замечание
Предоставляет 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
вызовы не могут уничтожить обновления, которые были сделаны или изменить данные, сохраненные при первомBeginEdit
вызове.Метод EndEdit отправляет все изменения, произошедшие после вызова BeginEdit, в базовый объект, если объект находится в режиме редактирования.
Метод CancelEdit удаляет любые изменения, внесенные в объект.
Дополнительные сведения о работе BeginEditи EndEditCancelEdit методах см. в разделе "Сохранение данных обратно в базу данных".
Эта транзакционная концепция функциональности данных используется контроллером DataGridView.
интерфейс ICancelAddNew
Класс, реализующий интерфейс ICancelAddNew, обычно реализует интерфейс IBindingList и позволяет откатить добавление в источник данных с помощью метода AddNew. Если источник данных реализует
IBindingList
интерфейс, он также должен реализоватьICancelAddNew
интерфейс.интерфейс IDataErrorInfo
Класс, реализующий интерфейс IDataErrorInfo, позволяет объектам предоставлять пользовательские сведения об ошибках для связанных элементов управления.
интерфейс IEnumerable
Класс, реализующий IEnumerable интерфейс, обычно используется ASP.NET. Поддержка Windows Forms для этого интерфейса доступна только через BindingSource компонент.
Замечание
Компонент BindingSource копирует все IEnumerable элементы в отдельный список для привязки.
интерфейс ITypedList
Класс коллекций, реализующий интерфейс ITypedList, предоставляет возможность управления порядком и набором свойств, доступных привязанному элементу управления.
Замечание
При реализации метода GetItemProperties и если массив PropertyDescriptor не является null, последняя запись в массиве будет дескриптором свойства, описывающего свойство списка, который является другим списком элементов.
интерфейс ICustomTypeDescriptor
Класс, реализующий ICustomTypeDescriptor интерфейс, предоставляет динамические сведения о себе. Этот интерфейс аналогичен ITypedList , но используется для объектов, а не для списков. Этот интерфейс используется DataRowView, чтобы проецировать схемы базовых строк. Простая реализация
ICustomTypeDescriptor
предоставляется классом CustomTypeDescriptor .Замечание
Для поддержки привязки во время разработки к типам, реализующим ICustomTypeDescriptor, тип также должен реализовывать IComponent и существовать в качестве экземпляра формы.
интерфейс IListSource
Класс, реализующий IListSource интерфейс, включает привязку на основе списка для объектов, отличных от списка. Метод GetList
IListSource
используется для возврата привязываемого списка из объекта, который не является наследником IList.IListSource
используется классом DataSet .интерфейс IRaiseItemChangedEvents
Класс, реализующий IRaiseItemChangedEvents интерфейс, является привязываемым списком, который также реализует IBindingList интерфейс. Этот интерфейс используется для указания, вызывает ли ваш тип события типа ItemChanged через его свойство RaisesItemChangedEvents.
Замечание
Вы должны реализовать IRaiseItemChangedEvents, если ваш источник данных предоставляет свойство для перечисления преобразования событий, описанного ранее, и взаимодействует с компонентом BindingSource. В противном случае
BindingSource
также будет выполнять преобразование свойства в событие списка, что приведет к снижению производительности.интерфейс ISupportInitialize
Компонент, реализующий ISupportInitialize интерфейс, использует преимущества пакетной оптимизации для задания свойств и инициализации созависимых свойств. Содержит
ISupportInitialize
два метода:интерфейс ISupportInitializeNotification
Компонент, реализующий ISupportInitializeNotification интерфейс, также реализует ISupportInitialize интерфейс. Этот интерфейс позволяет уведомлять другие
ISupportInitialize
компоненты о завершении инициализации. ИнтерфейсISupportInitializeNotification
содержит два элемента:IsInitialized
boolean
возвращает значение, указывающее, инициализирован ли компонент.Initialized происходит, когда вызывается EndInit.
интерфейс INotifyPropertyChanged
Класс, реализующий этот интерфейс, является типом, который вызывает событие при изменении любого из его значений свойств. Этот интерфейс предназначен для замены шаблона события изменения для каждого свойства элемента управления. При использовании в BindingList<T>, бизнес-объект должен реализовать INotifyPropertyChanged интерфейс, а BindingList`1 преобразует PropertyChanged события в ListChanged события типа ItemChanged.
Замечание
Чтобы уведомление об изменении произошло в привязке между клиентом и источником данных, ваш связанный тип данных должен либо реализовать интерфейс INotifyPropertyChanged (предпочтительно), либо предоставить события propertyName
Changed
для связанного типа, но не рекомендуется делать оба.
Интерфейсы для реализации авторами компонентов
Следующие интерфейсы предназначены для использования подсистемой привязки данных 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 является наиболее распространенным источником данных 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 путем добавления свойств, методов и событий, необходимых для двусторонней привязки данных.-
Элементы управления Windows Forms могут быть привязаны к источникам данных, которые поддерживают только интерфейс IEnumerable, если они привязаны через компонент BindingSource.
объекты данных ADO.NET
ADO.NET предоставляет множество структур данных, подходящих для привязки. Каждый отличается степенью изысканности и сложностью.
-
DataColumn является основным строительным блоком DataTable, поскольку несколько столбцов составляют таблицу. Каждый
DataColumn
имеет свойство DataType, определяющее тип данных, которые хранит столбец (например, марка автомобиля в таблице, описывающей автомобили). Можно просто привязать элемент управления (например, свойство TextBox элемента управления Text) к столбцу в таблице данных. -
DataTable — это представление таблицы с строками и столбцами в ADO.NET. Таблица данных содержит две коллекции: DataColumn, представляющую столбцы данных в данной таблице (которые в конечном итоге определяют типы данных, которые можно ввести в этой таблице) и DataRow, представляющие строки данных в данной таблице. Вы можете выполнить сложную привязку элемента управления к сведениям, содержащимся в таблице данных (например, привязке элемента управления DataGridView к таблице данных). Однако при привязке к
DataTable
вы привязываетесь к представлению таблицы по умолчанию. -
DataView — это настраиваемое представление одной таблицы данных, которую можно отфильтровать или отсортировать. Представление данных — это моментальный снимок данных, используемый сложными элементами управления. Вы можете выполнить простую привязку или сложную привязку к данным в представлении данных, но следует помнить, что вы привязываетесь к фиксированному образу данных, а не к чистому, обновляемому источнику данных.
-
DataSet — это коллекция таблиц, связей и ограничений данных в базе данных. Вы можете выполнить простую или сложную привязку к данным в наборе данных, но обратите внимание, что вы привязываетесь к умолчанию для DataViewManager элемента
DataSet
(см. следующий пункт). -
DataViewManager — это настраиваемое представление всего DataSet, аналогичное DataView, но с включенными отношениями. С помощью коллекции DataViewSettings можно задать фильтры по умолчанию и параметры сортировки для всех представлений, которые
DataViewManager
имеет для данной таблицы.
-
Типы привязки данных
Windows Forms может использовать два типа привязки данных: простую привязку и сложную привязку. Каждый из них предлагает различные преимущества.
Тип привязки данных | Описание |
---|---|
Простая привязка данных | Возможность элемента управления привязаться к одному элементу данных, например значению в столбце в таблице набора данных. Простая привязка данных — это тип привязки, типичный для элементов управления, таких как TextBox элемент управления или Label элемент управления, которые обычно отображают только одно значение. На самом деле любое свойство элемента управления может быть привязано к полю в базе данных. В Visual Studio существует обширная поддержка этой функции. Дополнительные сведения см. в статье "Навигация по данным" и создание простого элемента управления (Windows Forms .NET). |
Сложная привязка данных | Возможность привязки элемента управления к нескольким элементам данных, как правило, более одной записи в базе данных. Сложная привязка также называется привязкой на основе списка. Примерами элементов управления, поддерживающих сложную привязку, являются элементы управления DataGridView, ListBoxи элементы управления ComboBox. См. пример сложной привязки данных в разделе Как: Привязать элемент управления ComboBox или ListBox Windows Forms к данным. |
Компонент источника привязки
Чтобы упростить привязку данных, Windows Forms позволяет привязать источник данных к компоненту BindingSource, а затем привязать элементы управления к BindingSource
. Вы можете использовать BindingSource
в простых или сложных сценариях привязки. В любом случае BindingSource
выступает в качестве посредника между источником данных и связанными элементами управления, предоставляя управление уведомлениями об изменениях, управление валютой и другие услуги.
Распространенные сценарии, использующие привязку данных
Практически каждое коммерческое приложение использует информацию, считываемую из источников данных одного или другого типа, как правило, с помощью привязки данных. В следующем списке показано несколько наиболее распространенных сценариев, использующих привязку данных в качестве метода представления и манипуляции данными.
Сценарий | Описание |
---|---|
Отчётность | Отчеты предоставляют гибкий способ отображения и суммирования данных в печатном документе. Обычно создается отчет, который выводит выбранное содержимое источника данных на экран или на принтер. К общим отчетам относятся списки, счета и сводки. Элементы располагаются в виде столбцов списков, с подэлементами, организованными под каждым элементом списка, однако следует выбрать макет, который лучше всего подходит для данных. |
Ввод данных | Распространенный способ ввода больших объемов связанных данных или запроса пользователей на получение информации — через форму ввода данных. Пользователи могут вводить сведения или выбирать варианты с помощью текстовых полей, кнопок параметров, раскрывающихся списков и флажков. Затем данные передаются и хранятся в базе данных, структура которой основана на введенных сведениях. |
Связь "Основной/детальный" | Основное или подробное приложение — это один формат для поиска связанных данных. В частности, в классическом бизнес-примере имеются две таблицы данных: "Клиенты" и "Заказы". Между ними существует связь, которая соединяет клиентов с их соответствующими заказами. Дополнительные сведения о создании основного или подробного приложения с двумя элементами управления Windows Forms см. в статье "Практическое руководство. Создание основной или подробной формы с помощью двух элементов управления DataGridView в Windows FormsDataGridView". |
Таблица подстановки | Еще один распространенный сценарий представления и манипуляции данными — это поиск таблицы. Часто в рамках отображения больших данных элемент управления ComboBox используется для отображения и управления данными. Ключ заключается в том, что данные, отображаемые в элементе управления ComboBox , отличаются от данных, записанных в базу данных. Например, если у вас есть элемент управления ComboBox , отображающий элементы, доступные из продуктового магазина, вы, вероятно, хотите увидеть названия продуктов (хлеб, молоко, яйца). Тем не менее, чтобы упростить получение информации в базе данных и нормализацию базы данных, вы, вероятно, сохраните информацию для определенных элементов заданного заказа в качестве номеров элементов (#501, #603 и т. д.). Таким образом, существует неявная связь между "дружественным именем" товарного элемента в элементе управления на ComboBox форме и соответствующим номером позиции, который присутствует в заказе. Это суть поиска по таблице. Дополнительные сведения см. в разделе Создание таблицы поиска с использованием компонента Windows Forms BindingSource. |
См. также
.NET Desktop feedback