簡體   English   中英

如何防止CurrencyManager為綁定對象調用BeginEdit()/ EndEdit()方法

[英]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中的所有綁定)在綁定對象更改時自行執行此操作。

您要么必須更改邏輯以處理更高級別的更改跟蹤,要么從類中刪除接口,但保留方法。 這樣做意味着你每次都必須明確地調用BeginEditEndEditCancelEdit

如果你有一個Bindingsource,你可以在CurrentChanged事件上調用EndEdit()來中和CurrencyManager的BeginEdit()。

它不會阻止在每次位置變化時調用BeginEdit的成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM