久しぶりに VB.NET の話。
DataGridView にチェックボックスを表示するケースってよくあると思うが、そのときの注意点。
チェックボックスにチェックした時点で何もする必要がなければいいんだけど、例えばチェックした、あるいはチェックを外したって時に何かをしたいことってあるよね。
チェックした行のデータの内容によって、複数のボタンの Enabled を制御したいとかね。
そんなとき、CellValueChanged イベントだとちょっと困るんだよな。チェックボックスからフォーカスが外れないとイベントが発生しないし。押して、チェックした瞬間に実行したいんや!!
そんなときは、素直に「DataSetView 上で発生した CellMouseClick イベントを拾う」のが一番簡単だな。
CellMouseClick が発生したら、
Private Sub HogeDataGridView_CellMouseClick(ByVal sender As System.Object, ByVal e As DataGridViewCellMouseEventArgs) Handles HogeDataGridView.CellMouseClick' 明細行クリック時のみIf e.RowIndex >= 0 Then' 左端(0セル目)がクリックされた時のみIf e.ColumnIndex = 0 Then' 未チェック状態ならチェックに、逆なら未チェックにIf CBool(HogeDataGridView.CurrentRow.Cells(0).Value) ThenHogeDataGridView.CurrentRow.Cells(0).Value = FalseElseHogeDataGridView.CurrentRow.Cells(0).Value = TrueEnd IfEnd If' ★この後ろに、色々処理をかけばよろし★End IfEnd Sub
こんな感じで、自分でチェックボックスの制御(チェックをつけたり外したり)をしつつ、やりたい処理を書けばええわけやね。
ただ、この時気をつけないといかんのが「本来のチェックボックスの制御処理と競合しないように」ってことやね。
具体的には、ExtendDataGridView タスクの画面で「編集を有効にする」のチェックを外してしまわないとダメ。(なので、DataGridView 上でデータの修正をさせたい場合はアウトです(^^;)
こうしないと、CellMouseClick イベントが走った後で、VB が「本来のチェックボックスの中を更新する」処理を行なうので、せっかくつけたチェックが外されちゃったりする。
で、「チェックボックスがチェックされてないのに、値は True 」みたいな変なことになっちゃうんよねえ~(ちなみに、チェックボックスをクリックした場合だけです。0番セルの「チェックボックスではないところ」をクリックした場合は「本来のチェックボックスの中を更新する」処理は実行されないので問題はありませんたろう。
じゃあ、素敵な VB.NET ライフを!