And*_*rko 3 .net data-binding winforms
我想将业务对象列表绑定到Winforms控件(DataGridview,ComboBox等).
有几种方法可以做到这一点:
我可以为业务对象创建包装类并覆盖它们的ToString方法实现.这对ComboBox,ListBox Items.(Add|AddRange)方法很有用 .
但这对DataGridView不起作用.它需要ObjectDataSource在设计器模式下调整列.
由于应该有ObjectDataSources(对于DataGridViews)和包装类,我决定只留下一种方法.ObjectDataSource一个.
现在我有用于数据绑定的ObjectDataSources.当我使用向导时,它将属性添加到我可以使用的表单,如下所示:
MyObjectDataSoure.DataSource = list-of-entities;
Run Code Online (Sandbox Code Playgroud)
这填补了潜在的winforms控制.但我也可以直接将实体列表分配给控件的数据源属性,并且人口将是相同的.
MyWinformsControl.DataSource = list-of-entities
Run Code Online (Sandbox Code Playgroud)
是的,现在我没有ObjectDataSource事件,但可能有更普遍的东西我想念?我应该避免收听winforms事件(选择更改,用户添加行)并使用对象数据源事件吗?
使用对象数据源及其事件的最佳实践是什么?
先感谢您!
首先,不要将Window Forms表单或控件直接绑定到数据对象.有几个已知错误(例如:https://connect.microsoft.com/VisualStudio/feedback/details/92260/datagrid-memory-leak-resulted-from-failed-clear-of-databind)涉及Windows失败表单绑定机制以在直接绑定下正确释放对象.相反,总是通过BindingSource进行绑定,这将允许您的对象在其他地方不使用时被释放用于垃圾回收.
至于其余部分,我建议保持绑定机制尽可能简单.如果需要为某些特定情况(如DataGridView设计时支持)添加对象数据源,请仅针对这些情况执行此操作.有一天,你最终可能会使用一个没有类似限制的备用网格控件,因为一个你甚至没有的问题而被困在一个过于复杂的整体绑定模式上会非常不方便了.