3

我有一个带有几个文本框和一个数据网格的表单。一个业务实体可以绑定到此表单。例如,BO 看起来像这样:

class BO : IEditableObject, INotifyPropertyChanged
{
  public string FirstName {get; set;}
  public string LastName {get; set}
  public BindingList<BO> Relatives {get; set}
  // implementation of the interfaces

}

所以在表单上,​​FirstName 和 LastName 绑定到文本框,Relatives 绑定到网格。同样在表单上我有按钮保存和取消。单击保存按钮时,我调用 IEditableObject.EndEdit(),单击取消按钮时,我调用 IEditableObject.CancelEdit()。我希望 CancelEdit() 方法拒绝用户所做的所有更改,包括绑定到网格的亲属的更改。到现在为止还挺好..

但是网格控件使用 CurrencyManager(网格实际上是 Devexpress 控件,但没关系,因为我相信 WinForms 控件也使用它)。每次用户更改行时,CurrencyManager 都会为 Relatives 集合中的项目调用 BeginEdit() 和 EndEdit()。因此,当单击 Cancel() 按钮时,只会取消 FirstName 和 LastName 中的更改,因为对于 Relatives 集合中的子对象 EndEdit() 已经被网格的底层 CurrencyManger 调用!所以,问题 - 如何防止 CurrencyManager 调用这些方法,以便我可以通过一次调用拒绝所有更改?

谢谢!

4

2 回答 2

2

您唯一的解决方案是IEditableObject从您的业务对象中删除实现。(CurrencyManager用于 Winforms 中的所有绑定)在绑定对象更改时自行执行此操作。

您要么必须更改逻辑以处理更高级别的更改跟踪,要么从类中删除接口但保留方法。这样做意味着您每次都必须明确调用BeginEdit,EndEdit和。CancelEdit

于 2011-02-08T14:52:06.033 回答
0

如果您有 Bindingsource,则可以在 CurrentChanged 事件上调用 EndEdit() 以中和 CurrencyManager 的 BeginEdit()。

它不会阻止在每次更改位置时调用 BeginEdit 的成本。

于 2013-03-13T17:55:37.267 回答