[英]Usage of DataRow.BeginEdit() and DataRow.EndEdit() for single change
[英]How to prevent CurrencyManager from calling BeginEdit()/EndEdit() methods for bound objects
我有一個包含多個文本框和一個數據網格的表單。 一個業務實體可以綁定到此表單。 例如,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()方法拒絕用戶所做的所有更改,包括綁定到網格的Relatives中的更改。 到現在為止還挺好..
但是網格控件使用CurrencyManager(網格實際上是Devexpress控件但是沒關系,因為我相信WinForms控件也使用它)。 每次用戶更改行時,CurrencyManager都會為Relatives集合中的項調用BeginEdit()和EndEdit()。 因此,當單擊按鈕Cancel()時,只會取消FirstName和LastName中的更改,因為對於Relatives集合中的子對象,EndEdit()已經被網格的底層CurrencyManger調用了! 那么,問題是 - 如何阻止CurrencyManager調用該方法以便我可以通過一次調用拒絕所有更改?
謝謝!
您唯一的解決方案是從業務對象中刪除IEditableObject
的實現。 CurrencyManager
(用於Winforms中的所有綁定)在綁定對象更改時自行執行此操作。
您要么必須更改邏輯以處理更高級別的更改跟蹤,要么從類中刪除接口,但保留方法。 這樣做意味着你每次都必須明確地調用BeginEdit
, EndEdit
和CancelEdit
。
如果你有一個Bindingsource,你可以在CurrentChanged事件上調用EndEdit()來中和CurrencyManager的BeginEdit()。
它不會阻止在每次位置變化時調用BeginEdit的成本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.