【问题标题】:WinForms data binding with a Save button?带有保存按钮的 WinForms 数据绑定?
【发布时间】:2011-01-26 14:30:31
【问题描述】:

当您有“保存”按钮时,C# WinForms 中的数据绑定应该如何工作?我不希望在按“保存”之前更新数据!

我有两个表单(列表和详细信息),分别由 BindingList<T> 集合和来自该集合的自定义对象支持。我可以将每个表单适当地绑定到列表或对象。但是,在详细信息表单中所做的任何更改都会立即反映在列表表单中 - 在按下“保存”按钮之前,我不想保存更改并更新列表中显示的详细信息。

数据绑定是否旨在支持这一点?这样做有一个共同的模式吗?

无论我怎么看,绑定似乎都无法支持这种情况。我考虑了以下几点:

  • 将对象的克隆传递给详细信息表单,但随后我必须协调保存时的更改 - 同时可能已对列表中的副本进行了更改。

  • 实现 IEditableObject 并在保存时调用 EndEdit 几乎可以正常工作,因为我可以防止在按下保存之前通知列表所做的更改,但如果有其他原因导致刷新,则列表将使用临时更新数据。

我目前在我的详细视图中放弃了数据绑定,并且全部手动完成。这很烦人。

【问题讨论】:

    标签: c# winforms data-binding binding


    【解决方案1】:

    不幸的是,数据绑定确实不是为这种事情而设计的。

    我们在这里找到的最佳解决方案是编辑对象克隆,然后协调更改,正如您所提到的。您可能想要提供一个自定义集合和/或对象接口来帮助您管理此类事物。

    即使克隆方法的前期工作稍微多一些,它也不会比使用IEditableObject 尝试捕获所有可能更新数据的事件更简单和令人沮丧。不仅如此,这是一种更直接的方法,而且您最终不会得到意大利面条式代码。

    【讨论】:

      【解决方案2】:

      如果您打算使用绑定列表,最好的办法是实现 IBindingList 以创建您想要的功能。也可以通过简单地从 BindingList 继承并覆盖适当的方法来更改绑定列表的行为来实现这一点。

      http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglist.aspx

      如果您没有设置使用绑定列表,最好根据控件的事件手动执行数据操作。

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        相关资源
        最近更新 更多