3

複数のテキストボックスと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がそのメソッドを呼び出さないようにするにはどうすればよいですか?

ありがとう!

4

2 に答える 2

2

唯一の解決策はIEditableObject、ビジネスオブジェクトからの実装を削除することです。(CurrencyManagerWinformsのすべてのバインディングに使用されます)は、バインドされたオブジェクトが変更されたときに、それ自体でこれを行います。

より高いレベルの変更追跡を処理するためにロジックを変更するか、クラスからインターフェイスを削除してメソッドを残す必要があります。BeginEditこれを行うと、毎回、、EndEditを明示的に呼び出す必要があります。CancelEdit

于 2011-02-08T14:52:06.033 に答える
0

Bindingsourceがある場合は、CurrentChangedイベントでEndEdit()を呼び出して、CurrencyManagerのBeginEdit()を無効にすることができます。

位置が変わるたびにBeginEditを呼び出すコストを防ぐことはできません。

于 2013-03-13T17:55:37.267 に答える