2011-06-27 10 views
0

ビジネスオブジェクトのリスト(オブジェクトごとに1つの編集可能なフィールドのみ)にバインドされた単純なDataGridViewがあります。バインドされたオブジェクトを更新するために、ユーザーが行う値(DataGridViewTextBoxColumn内の値)に対する変更が必要です。つまり、通常のテキストボックスをバインドし、 'OnPropertyChanged'オプションを使用する場合と同じ方法で、すべてのキー押下を更新します。TextBox値が変更された直後にDataGridViewデータソースを更新する

これは、バインドされたオブジェクトの 'IsDirty'プロパティがtrueの場合にフォーム上の「OK」ボタンを有効にするだけで済むためです。

チェックボックスの列とCurrentCellDirtyStateChangedイベントを使用してCommitEditを呼び出す方法については、さまざまなWebサイトで多くの議論があるようです。私はこれを試しましたが、これは最初のキー押しですべてのテキストのセルをクリアするという不幸な副作用を持っていました!

ご協力いただきありがとうございます。

+0

実際にデータソースを更新する必要がありますか?代わりに単にCurrentCellDirtyStateChangedイベントを使用してボタンを有効にできませんでしたか?ボタンがクリックされたときにフォーカスが失われると、データソースが更新されます。 –

答えて

0

ユーザーが任意のセルに入力を開始するとすぐにボタンを有効にするのが望ましいように聞こえますか?ボタンをクリックする前に実際にDataSourceを更新する必要がありますか?

もしそうでなければ、CurrentCellDirtyStateChangedは正常に動作するはずです。ちょうどCommitEditメソッドを呼び出さず、そこでボタンを有効にしてください。

セルがフォーカスを失うと、変更がDataSourceに適用されます。そのため、ボタンをクリックすると、正しいデータで作業することができます。


は、私は解決策を見つけたかもしれないと思う - 私はあなたがIsDirtyの変更を配線し、それをすべての作業を参照してくださいする必要がMVCコントローラを持っていないので、100%ではないことを確認 - 私はブレークポイントを入れていませんでした私のDataSourceオブジェクトのプロパティセッターは、次のコードで起動されますが、それがないと起動しないので、これはうまくいくと思います。

単純に、DataErrorContextパラメータにCurrentCellDirtyStateChanged列とCurrentCellChange列挙型を使用しました。

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange); 
} 
+0

それは私がはいりたいと思う効果ですが、私はModel-View-Controller(MVC)アーキテクチャーを持っているので、オブジェクト内で作業を行う必要があります。このボタンは、フォーム上のコードから直接ではなく、オブジェクトが汚れている場合に有効になります。 – Darren

+0

私は、MVPアーキテクチャ(MVPをwinformsに使用する)を取得しようとすると、データバインディングが途切れることがわかりました。 –

+0

@Darren - また、アーキテクチャの考え方は、厳密な厳密なパッシブビューを使用しない限り、CurrentCellDirtyStateChangedイベントからコントローラにメッセージを送信して、必要に応じてビューを変更することはできません - データバインディングは、必然的にそれに来る必要があります。 –

関連する問題