WinForms:对象数据源使用最佳实践

时间:2010-09-23 11:10:18

标签: .net winforms data-binding

我想将业务对象列表绑定到Winforms控件(DataGridview,ComboBox,e.t.c。)。

有几种方法可以做到这一点:

我可以为业务对象创建包装类并覆盖它们的ToString方法实现。这对于ComboBox,ListBox Items.(Add|AddRange)方法很有用。

但这对DataGridView不起作用。它需要ObjectDataSource在设计器模式下调整列。

因为应该有ObjectDataSources(对于DataGridViews)和包装类,所以我决定只留下一种方法。 ObjectDataSource一个。

现在我有用于数据绑定的ObjectDataSources。当我使用向导时,它会将属性添加到我可以使用的表单中,如下所示:

MyObjectDataSoure.DataSource = list-of-entities;

填充底层winforms控件。但我也可以直接将实体列表分配给控件的数据源属性,并且人口将是相同的。

 MyWinformsControl.DataSource = list-of-entities

是的,现在我没有ObjectDataSource事件,但可能有更普遍的我想念的东西?我应该避免收听winforms事件(选择更改,用户添加行)并使用对象数据源事件吗?

使用对象数据源及其事件的最佳做法是什么?

提前谢谢!

1 个答案:

答案 0 :(得分:5)

首先,不要将Window Forms表单或控件直接绑定到数据对象。有几个已知的错误(例如:https://connect.microsoft.com/VisualStudio/feedback/details/92260/datagrid-memory-leak-resulted-from-failed-clear-of-databind)涉及Windows窗体绑定机制无法在直接绑定下正确释放对象。相反,总是通过BindingSource进行绑定,这将允许您的对象在其他地方没有使用时被释放用于垃圾收集。

至于其他方面,我建议保持绑定机制尽可能简单。如果需要为某些特定情况(如DataGridView设计时支持)添加对象数据源,请仅针对这些情况执行此操作。有一天,你最终可能会使用一个没有类似限制的备用网格控件,因为一个你甚至没有的问题而被困在一个过于复杂的整体绑定模式上会非常不方便了。