c# - 如何防止 CurrencyManager 为绑定(bind)对象调用 BeginEdit()/EndEdit() 方法

标签 c# winforms data-binding ieditableobject currencymanager

我有一个包含多个文本框和一个数据网格的表单。一个业务实体可以绑定(bind)到此表单。例如,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 绑定(bind)到文本框,Relatives 绑定(bind)到网格。同样在表单上我有按钮保存和取消。单击保存按钮时,我调用 IEditableObject.EndEdit(),单击取消按钮时,我调用 IEditableObject.CancelEdit()。我希望 CancelEdit() 方法拒绝用户所做的所有更改,包括绑定(bind)到网格的 Relatives 中的更改。到目前为止一切顺利..

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

谢谢!

最佳答案

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

您要么必须更改逻辑以处理更高级别的更改跟踪,要么从类中删除接口(interface)但保留方法。这样做意味着您每次都必须显式调用 BeginEditEndEditCancelEdit

关于c# - 如何防止 CurrencyManager 为绑定(bind)对象调用 BeginEdit()/EndEdit() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4934452/

相关文章:

wpf - winforms或wpf是否有类似于asp.net mvc的东西?

c# - Windows 窗体 : How to directly bind a Bitmap to a PictureBox?

javascript - Knockout.js 单击带有参数的绑定(bind)

c# - 如何将signalR实现到通过后端服务连接的两个项目

c# - WCF 往返后 EF 中的 FK 出现问题

c# - "only part of a readprocessmemory or writeprocessmemory request was completed"process.start 期间

c# - 读取和写入带有破折号、左引号等特殊字符的文件的编码是什么?

c# - 在系统关闭时强制关闭应用程序

c# - 使用paint时如何在WinForms中实现垂直和水平滚动条?

c# - 绑定(bind)到 MainView 窗口的 Width 属性时出现绑定(bind)错误