2011-09-08 11 views
2

[[http://msdn.microsoft.com/de-de/library/15a31akc.aspx]]からのウォークスルーを使用して、VB 10 Expressで仮想モードのDatagridViewを実装しました。私たちはWinForms )。仮想バインドされていないDataGridViewの編集コントロールイベントハンドラ内から現在の行のコミットを強制するにはどうすればよいですか?

CommitEdit (DataGridViewDataErrorContexts.Commit)は、現在のセルの内容をデータキャッシュにコミットすることを理解しています。

この例では、行レベルのコミットを使用しています。つまり、現在の行が残されるまで値を行バッファにプッシュします。その後、データストアに行が追加(または更新)されます。それはまさに私がやっていることです。

質問 - 現在の行をプログラムから除外せずにコミットするにはどうすればよいですか?(私は行全体をコミットしたいだけではなく、現在のセル。)

ユーザーが行を離れた場合は、データストアの更新が世話をされRowValidatingRowValidatedRowEnterイベントシーケンスがあります。だから1つのアイデア(現在私の唯一のアイデア)は、たとえばCurrentCellNothingに設定するだけです。

しかし、私はちょうど私がカスタム列によって作成されたカスタムエディットコントロールのイベントハンドラ内からコミットしたいので、Nothing(または現在の行の外側の任意のセル)にDataGridViewCurrentCellプロパティを設定し、IすることはできませんそこにCurrentCellを設定する場合は、System.InvalidOperationExceptionの例外を参照してください。

実際、それはコンボボックスの右にある小さなボタンです。すなわち、子孫の編集コントロールDataGridViewComboBoxColumnの子孫DataGridViewComboBoxCellを作成します。私の特別なComboBoxセルは、現在の行をコミットするはずの小さなボタンを追加します。残念ながら、そのボタンの_Clickイベントハンドラは、DetachEditingControlが例外をスローするため、CurrentCellを変更することはできません。

明らかに、_Clickイベント全体が処理されるまで、CurrentCell再割り当てを延期する必要があります。または何?どうすればいいですか?このメッセージが受信されたときに、というカスタムWindowsメッセージを登録して、フォームのウィンドウプロシージャをオーバーライドするように設定し直します(CurrentCell)。 (こんにちは)

DataGridViewは、データストアの更新を実行するために処理するイベントを発生させて、すべての変更をコミットすることは簡単です。

私が話していることがややはっきりしていることを願っています。私はまだコンパクトなコード例を持っていない:(ここで

+0

Ah、addendum:DataGridViewにRowCountだけを設定しません(「DataGridViewがバインドされていません。 – TheBlastOne

答えて

2

は、現在の行をコミットする信頼性の高い方法である:

' Optional: mark the current cell as dirty so the current row definetely will be 
' commited: 
MyDataGridView.NotifyCurrentCellDirty(True) 

' Aktuelle Row commiten. Einen besseren Weg als "Keine Zelle selektieren, dann Originalzelle wieder selektieren" kenne ich nicht: 
Dim OrigCellAddress As Point = New Point(MyDataGridView.CurrentCellAddress.X, MyDataGridView.CurrentCellAddress.Y) 
MyDataGridView.CurrentCell = Nothing 
MyDataGridView.CurrentCell = MyDataGridView.Rows(OrigCellAddress.Y).Cells(OrigCellAddress.X) 

例外の問題は、私は私のRowEnterイベントで実行するにBeginEdit/EndEdit順序でしたハンドラ:(非リエントラントなものを間接的に再帰的に呼び出す結果となりました)。

関連する問題