logo
03

Источники данных

Связь контролов со структурами данных, такими, как DataTable, коллекциями или просто объектами сокращает количество кода и упрощает разработку. В Windows Forms за это отвечает механизм Data Binding. К сожалению, Data Binding имеет, пожалуй, самую неудачную реализацию из всей библиотеки .NET Framework. По этой причине многие авторы библиотек компонентов реализуют свою собственную стратегию связи с данными. Если же вы решитесь-таки использовать Data Binding, при создании контролов вам понадобится следовать нескольким простым правилам.

Привязка к данным может быть двух видов – к записи или списку. Некоторые контролы, вроде ListBox привязываются к источнику данных (DataSource) и отображают все его элементы тем или иным способом. Другие, вроде TextBox, могут быть привязаны к некоторой колонке текущей записи в источнике данных, и при смене позиции их содержимое обновляется. Источником также может служить обычная коллекция, не имеющая отношения к базам данных.

Свойства, которые могут быть связаны с данными, помечайте атрибутом [Bindable(true)]. В этом случае они появятся в выпадающем списке (DataBindings), и к ним можно будет привязать источник. Очевидно, что такие свойства должны быть доступны как на чтение, так и на запись. Если атрибут Bindable не использован или использован со значением false, то к свойству всё равно можно подсоединить источник данных, хотя и без гарантий, что всё будет работать как нужно. Для этого надо открыть пункт Advanced в списке (DataBindings).

Предоставляйте событие <PropertyName>Changed, где PropertyName – имя свойства. Пользуясь этим событием, среда разработки и другие компоненты смогут узнать об изменении свойства и обновить информацию в связанных данных. Система связи с данными также подписывается на событие Validating, если оно есть. При этом происходит попытка передать данные в источник данных для обновления, а при ошибке выставляется флаг Cancel в CancelEventArgs.

Если вы предоставите свойство <PropertyName>IsNull типа bool, то в случае true значением свойства будет считаться DbNull, а само свойство опрашиваться не будет.

Если вы разрабатываете контрол, который должен привязываться ко всему источнику данных, используйте CurrencyManager в качестве менеджера связи. Название этого класса неудачно, но именно этот наследник BindingManagerBase используется в контролах Windows Forms для управления связью со списками. Для связи с одним объектом используется другой класс – PropertyManager.