複数のテキストボックスと1つのデータグリッドを持つフォームがあります。 1つのビジネスエンティティをこのフォームにバインドすることができます。例えば、BOは次のようになります。フォーム上だから、CurrencyManagerがバインドされたオブジェクトのBeginEdit()/ EndEdit()メソッドを呼び出さないようにする方法
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の&は、テキストボックスや親戚にバインドされたグリッドにバインドされています。また、フォームに私はボタンを保存し、キャンセルしています。保存ボタンをクリックするとIEditableObject.EndEdit()が呼び出され、キャンセルボタンをクリックするとIEditableObject.CancelEdit()が呼び出されます。グリッドにバインドされている親戚の変更を含む、ユーザーが行ったすべての変更をCancelEdit()メソッドで拒否します。グリッドコントロールはCurrencyManagerを使用しています(グリッドは実際にはDevexpressコントロールですが、WinFormsコントロールでもグリッドが使用されているとは限りません)。そしてCurrencyManagerは、ユーザーが行を変更するたびにBeginEdit()& EndEdit()を親戚コレクションに呼び出します。したがって、ボタンキャンセル()をクリックすると、FirstName & LastNameの変更のみがキャンセルされます。親子コレクションEndEdit()内の子オブジェクトは、グリッドの基礎となるCurrencyMangerによって既に呼び出されているためです。だから、質問 - どのように私はすべての変更を1つの呼び出しで拒否できるように、そのメソッドを呼び出すからCurrencyManagerを防ぐには?
ありがとうございます!
ありがとうございました。 IEditableObjectを私自身のインターフェースに置き換えることも考えていました。 IEditableObjectを削除すると、WinFormsが提供する便利な機能が失われますか?限り、私はそれが主にグリッドで使用される参照してください。 – Dmitry
@Dmitry:すべてのバインディングシナリオで使用されます。実際には、通常はグリッドが自動的に取り消しを実行する唯一のコントロールであるため、取り消すことができるのは取り消すことだけです。 –