2017-08-22 15 views
0

私はエンティティを持っています。顧客はhere説明のように、IEditableObjectから継承された:私のUIクラスではIEditableObject.BeginEdit()が複数回呼び出されないようにします。

public class Customer : IEditableObject 
{ 
    ... 
    private Boolean backupAvailable = false; 
    private ThisObject backupData; 

    public void BeginEdit() 
    { 
     if (!backupAvailable) 
     { 
      this.backupData.Name = this.Name; 
      backupAvailable = true; 
     } 
    } 

    public void CancelEdit() 
    { 
     if (backupAvailable) 
     { 
      this.Name = this.backupData.Name; 
      backupAvailable = false; 
     } 
    } 

    public void EndEdit() 
    { 
     if (backupAvailable) 
     { 
      backupData = new ThisObject(); 
      backupAvailable = false; 
     } 
    } 
} 

を私はすべてのコントロールがバインドされているBindingSourceを、持っている、と2つのボタン "変更" と "キャンセル":

BindingSource BSCustomer; 

private void buttonChange_Click(object sender, EventArgs e) 
{ 
    ... 
    ((Customer)BSCustomer.Current).BeginEdit(); 
} 


private void buttonCancel_Click(object sender, EventArgs e) 
{ 
    ... 
    ((Customer)BSCustomer.Current).CancelEdit(); 
} 

これは正常に動作します。

しかし、今私は、例えば、BeginEdit()は私の明示的な呼び出しから呼び出されるが、他の多くのコードから呼び出されるだけでなく、検出されました:

BSCustomer.AllowNew = true; 

または

BSCustomer.AddNew(); 

または

BSCustomer.IndexOf(); 

ボタン「変更」ボタンをクリックすると、すでにbackupAvailableが設定されていますthの間違った値。 「キャンセル」をクリックすると間違った値が書き戻されます。

この呼び出しを防止する可能性はありますか?または、電話がどこから来るのかBeginEdit()で違うのですか?

+0

こんにちは、私はこれが「設計上」である、つまり「BeginEdit」がWFデータバインディングインフラストラクチャの多くの場所から「ちょうど場合に」呼び出されるのではないかと心配しています。それで 'bool'フラグが必要なのです。 'BeginEdit'、' CancelEdit'、 'EndEdit'が呼び出されたときを正確に制御したい場合、' Customer'クラスのメソッドを現在のように保ちますが、 'IEditableObject'(remove::IEditableObject')は実装しません。 –

+0

あなたは正しいです。私はDataGridView - BindingSource - BindingList - IEditableObjectチェーンを作成し、BindingSourceの初期化中にBindingListの最初の要素のBeginEditが何度か呼び出されることに気付きました。 EndEdit/CancelEditは呼び出されません。キーボードを使用してDataGridViewを移動すると、EndEdit/CancelEditを実行しなくてもBeginEditが何度も呼び出されます。明らかに、これらの関数は、元に戻す機能を作成するために信頼できるものではありません。 –

+1

こんにちはIvan、 'IEditableObject'を削除してトリックをやってしまいました。今、 'BeginEdit()'は、私が手動で呼び出すときに呼び出されます。どうも。 – Beetee

答えて

1

:IEditableObjectを削除するだけです。これがなければ、BeginEdit()は、手動で呼び出されたときに呼び出されます。

すべてのクレジットはIvanです。

関連する問題