gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:19:23 24 4
gpt4 key购买 nike

我有一个包含多个文本框和一个数据网格的表单。一个业务实体可以绑定(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com