なんやかんやと癖がすごいデータグリッドビュー。今回はユーザーが変更できるチェックボックスを設置したグリッドにて、とってもハマったので備忘録
チェックされてるレコードのカウントがたまにずれる
まず最初に起きたのがコレ。SQLでとってきたデータテーブルをデータソースとしたデータグリッドが在り、ユーザーがチェックボックスのONOFFが出来る画面。で、画面外にあるボタンを押すとチェックがONになっているレコードにメールを送るシステムなのですが、たまに送られない時が在った。
もう一つ押すと全てのレコードにチェックを入れるボタンがあるのだけれど、どうやらそいつを経由した場合のみに起きるっぽい事が判明。
原因はコミットが完了していないデータソースを見てたから
ボタン押下時に以下のようなコードで見ていたのが原因だった
1 2 3 4 5 6 |
DataTable Dt = (DataTable)DataGridView.DataSource; DataRow[] Rows = Dt.Select("選択 = 1"); if (Rows.Length == 0) { return; } |
データグリッドビューがコミットされるのは他のセルにフォーカスした時なので、ボタンで全選択させた後にここに来てデータソースを見ちゃうとまだコミットされてない状態な訳。
で、今回ハマってしまったのが以下の要因
Dtの中身はコミット後のデータが表示される
でも、一旦別Dtにコピーするとこうなる↓
データソースとはなんぞや…ってなった。 普段は基本こういう時コピーして使うけど、
データテーブルでCASTしてたので直接見てしまっていた。これが原因その①。
SelectとLinqでカウント数が違う
上で書いたSelectのカウント方法だと3件
でも下記のようにLinqでカウントすると4件になる。。。
Selectは既知のバグが有るって言うのがぼんやりと頭の片隅にあったので、絶対Selectが悪いんだと決めて掛かってしまった。これが原因その②。
EndEditで解決
データテーブルに突っ込む前に以下のコードを追加で処理が確定する。
1 2 |
((DataRowView)DataGridViewList.CurrentRow.DataBoundItem).EndEdit(); DataTable Dt = (DataTable)DataGridView.DataSource; |
こうすると、その後同じようにDt2にコピーしても全てのフラグが立った状態となる。
癖がすごい
コメント