WinForms: лучший способ использования источника данных объекта - PullRequest
3 голосов
/ 23 сентября 2010

Я хочу привязать список бизнес-объектов к элементу управления Winforms (DataGridview, ComboBox, e.t.c.).

Для этого есть несколько подходов:

Я могу создать классы-оболочки для бизнес-объектов и переопределить их реализацию метода ToString. Это будет хорошо работать для методов ComboBox, ListBox Items.(Add|AddRange).

Но это не будет работать для DataGridView. Для настройки столбцов в режиме конструктора требуется ObjectDataSource.

Поскольку должны существовать ObjectDataSources (для DataGridViews) и классы-оболочки, я решил оставить только один подход. ObjectDataSource один.

Теперь у меня есть ObjectDataSources для привязки данных. Когда я использую мастер, он добавляет свойство к форме, которое я могу использовать следующим образом:

MyObjectDataSoure.DataSource = list-of-entities;

Заполняет базовый элемент управления winforms. Но я также могу назначить список сущностей непосредственно для свойства источника данных control, и совокупность будет такой же.

 MyWinformsControl.DataSource = list-of-entities

Да, теперь у меня нет событий ObjectDataSource, но, может быть, я что-то более общее пропускаю? Следует ли мне избегать прослушивания событий winforms (выбор изменился, пользователь добавил строку) и использовать объекты источника данных?

Как лучше всего использовать источники данных об объектах и ​​их событиях?

Заранее спасибо!

1 Ответ

5 голосов
/ 24 сентября 2010

Прежде всего, не привязывайте форму Window Forms или элементы управления непосредственно к вашим объектам данных. Существует несколько известных ошибок (например: https://connect.microsoft.com/VisualStudio/feedback/details/92260/datagrid-memory-leak-resulted-from-failed-clear-of-databind), связанных с ошибкой механизма привязки Windows Forms для правильного освобождения объектов при прямой привязке. Вместо этого всегда выполняйте привязку через BindingSource, что позволит освободить ваши объекты для сбора мусора если они не используются в другом месте.

В остальном, я бы порекомендовал сделать механизм привязки максимально простым. Если вам нужно добавить источники данных объекта для некоторых конкретных обстоятельств, таких как поддержка времени разработки DataGridView, делайте это только для этих случаев. В один прекрасный день вы можете в конечном итоге использовать альтернативный элемент управления сеткой, который не имеет аналогичного ограничения, и было бы очень неудобно зацикливаться на слишком сложном общем шаблоне привязки только из-за проблемы, которой у вас даже нет больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...