プログラミング: 2014年10月アーカイブ

久しぶりに 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) Then
                HogeDataGridView.CurrentRow.Cells(0).Value = False
            Else
                HogeDataGridView.CurrentRow.Cells(0).Value = True
            End If
        End If

' ★この後ろに、色々処理をかけばよろし★

    End If

End Sub

こんな感じで、自分でチェックボックスの制御(チェックをつけたり外したり)をしつつ、やりたい処理を書けばええわけやね。

ただ、この時気をつけないといかんのが「本来のチェックボックスの制御処理と競合しないように」ってことやね。

20141017_vbdsv.jpg

具体的には、ExtendDataGridView タスクの画面で「編集を有効にする」のチェックを外してしまわないとダメ。(なので、DataGridView 上でデータの修正をさせたい場合はアウトです(^^;)
こうしないと、CellMouseClick イベントが走った後で、VB が「本来のチェックボックスの中を更新する」処理を行なうので、せっかくつけたチェックが外されちゃったりする。
で、「チェックボックスがチェックされてないのに、値は True 」みたいな変なことになっちゃうんよねえ~(ちなみに、チェックボックスをクリックした場合だけです。0番セルの「チェックボックスではないところ」をクリックした場合は「本来のチェックボックスの中を更新する」処理は実行されないので問題はありませんたろう。

じゃあ、素敵な VB.NET ライフを!
元の DataTable には「出席番号」「名前」「点数」が適当な順番で入っている。
例えば、

1 ロバート 25
2 ミッチェル 89
3 クリス 25
4 ブラウン 67
5 キヨシ 18

みたいに出席番号順とかで。

これを、「点数の降順」「出席番号の昇順」という条件でソートしたい。

2 ミッチェル 89
4 ブラウン 67
1 ロバート 25
3 クリス 25
5 キヨシ 18

にしたいわけやね。

DataTable では並び替え(ソート)は出来ないから、一旦 DataView を作成し、そこでソートをする。

Dim dv As DataView = ds.table.DefaultView
dv.Sort = "tokuten DESC, bangou"

こんな風に。
ここまでは良い。実際、並び替えは正常に行われたし。

で、並び替えた結果を別の DataTable に「並び替えた状態を保持したまま」コピーしたいんだけど、

Dim new_ds As New HogehogeDataSetView
new_ds.table.Merge(CType(dv.Table, HogehogeDataSetView.tableDataTable))

なんてキャストしてマージしちゃうと、「並び順がリセット」されちゃうのね・・・

仕方ないので、

Dim new_ds As New HogehogeDataSetView
For Each dvr As DataRowView In dv
    Dim dr As HogehogeDataSetView.tableRow = CType(dvr.Row, HogehogeDataSetView.tableRow)
    new_ds.table.ImportRow(dr)
Next
new_ds.AcceptChanges()

なんてやったんだけど(並び替えた結果を1件1件頭から追加していったわけやな)、なんか美しくないな。
一発でピシっとセットしたいわ。

VB.NET マスターの方、良い方法をアドバイスプリーズ!!

このアーカイブについて

このページには、2014年10月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2014年9月です。

次のアーカイブはプログラミング: 2014年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら