【问题标题】:WinForms: object data source usage best practiceWinForms:对象数据源使用最佳实践
【发布时间】:2023-03-25 23:40:01
【问题描述】:

我想将业务对象列表绑定到 Winforms 控件(DataGridview、ComboBox 等)。

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

我可以为业务对象创建包装类并覆盖它们的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事件(选择更改,用户添加一行)并使用对象数据源吗?

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

提前感谢您!

【问题讨论】:

    标签: .net winforms data-binding


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,妮可。我玩了绑定源并有一个问题:是否有“beforeDelete”事件?我只能处理“afterDelete”。看起来绑定源提供了处理 winControl -> 底层数据源通信的周能力。我想采用整体方法来处理事件,但看起来 bindingSources 是不够的。如果我使用 DataGrid + listBox,我可以为 dataGrid 处理 bindingSource 上的删除事件,但必须在 listBox 上监听“keyDowns”。
    • 对不起,我想我不明白你最后的评论是什么意思。 BindingSource 充当实际数据源与一个或多个控件的绑定之间的相对透明的中间层。除了在绑定时定位它,您根本不需要与它进行交互。您应该能够完全按照您已经在执行的操作继续执行删除操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多