複数のテキストボックスと1つのデータグリッドを含むフォームがあります。1つの事業体をこのフォームにバインドできます。たとえば、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()メソッドで、グリッドにバインドされている親戚の変更を含め、ユーザーが行ったすべての変更を拒否したい。ここまでは順調ですね..
ただし、グリッドコントロールはCurrencyManagerを使用します(グリッドは実際にはDevexpressコントロールですが、WinFormsコントロールも使用していると思うので問題ありません)。また、CurrencyManagerは、ユーザーが行を変更するたびに、Relativesコレクション内のアイテムに対してBeginEdit()とEndEdit()を呼び出します。したがって、[キャンセル()]ボタンをクリックすると、FirstNameとLastNameの変更のみがキャンセルされます。これは、Relativesコレクションの子オブジェクトのEndEdit()が、グリッドの基になるCurrencyMangerによってすでに呼び出されているためです。では、質問-1回の呼び出しですべての変更を拒否できるようにCurrencyManagerがそのメソッドを呼び出さないようにするにはどうすればよいですか?
ありがとう!