2011-02-08 11 views
3

複数のテキストボックスと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を防ぐには?

ありがとうございます!

答えて

2

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

より高度な変更追跡を処理するロジックを変更するか、クラスからインターフェイスを削除する必要がありますが、メソッドはそのままにしてください。これを行うと、毎回明示的にBeginEdit,EndEditCancelEditに電話する必要があります。

+0

ありがとうございました。 IEditableObjectを私自身のインターフェースに置き換えることも考えていました。 IEditableObjectを削除すると、WinFormsが提供する便利な機能が失われますか?限り、私はそれが主にグリッドで使用される参照してください。 – Dmitry

+0

@Dmitry:すべてのバインディングシナリオで使用されます。実際には、通常はグリッドが自動的に取り消しを実行する唯一のコントロールであるため、取り消すことができるのは取り消すことだけです。 –

0

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

ポジションの変更ごとにBeginEditを呼び出すコストを防ぎません。

関連する問題