私はエンティティを持っています。顧客は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()
で違うのですか?
こんにちは、私はこれが「設計上」である、つまり「BeginEdit」がWFデータバインディングインフラストラクチャの多くの場所から「ちょうど場合に」呼び出されるのではないかと心配しています。それで 'bool'フラグが必要なのです。 'BeginEdit'、' CancelEdit'、 'EndEdit'が呼び出されたときを正確に制御したい場合、' Customer'クラスのメソッドを現在のように保ちますが、 'IEditableObject'(remove::IEditableObject')は実装しません。 –
あなたは正しいです。私はDataGridView - BindingSource - BindingList - IEditableObjectチェーンを作成し、BindingSourceの初期化中にBindingListの最初の要素のBeginEditが何度か呼び出されることに気付きました。 EndEdit/CancelEditは呼び出されません。キーボードを使用してDataGridViewを移動すると、EndEdit/CancelEditを実行しなくてもBeginEditが何度も呼び出されます。明らかに、これらの関数は、元に戻す機能を作成するために信頼できるものではありません。 –
こんにちはIvan、 'IEditableObject'を削除してトリックをやってしまいました。今、 'BeginEdit()'は、私が手動で呼び出すときに呼び出されます。どうも。 – Beetee