mamori017.log

歴史的クソブログ

DataGridViewにチェックボックスを追加する

DataGridView上にデータベースから取得したデータとチェックボックスを表示させたい場合、 バインドするDataTableにチェックボックス列を追加することで表示できる。

Dim objDataTable As DataTable
Dim objCol As DataColumn

' チェックボックス列を作成
objColumn = New DataColumn("Checkbox",GetType(Boolean))

' DataTableにチェックボックス列を追加
objDataTable.Columns.Add(objColumn)

'データソースにDataTableをセット
objDataGridView.DataSource = objDataTable

' DataGridView再描画
objDataGridView.Refresh()

DataTableにチェックボックスのDataColumnを追加しただけだと、 DataTable上に存在するデータ列に追加されるかたちで配置される。

DataTableのイメージ
ColumnA ColumnB Checkbox
100 2017
101 2016

チェックボックス列の表示位置を変更したい場合はDataColumn.SetOrdinalを使用する。

' 引数は左端から0
objColumn.SetOrdinal(0)
SetOrdinalで列を変更した場合のDataTableのイメージ
Checkbox ColumnA ColumnB
100 2017
101 2016

セルを読み取り専用にする場合はDataGridViewのReadOnlyプロパティをTrueに変更する。 ただし、DataGridViewのReadOnlyプロパティを変更すると、DataGridView上のセルすべてに適用されるため、 チェックボックスの変更のみを有効にしたい場合は、 DataGridViewをRefreshする前に個別にプロパティを変更する。

' 左端列がチェックボックスの場合
For i As Integer = 1 To objDataGridView.ColumnCount - 1
    objDataGridView.Columns(i).ReadOnly = True
Next

SQLでAVGとCOUNTはNULLを無視する

ColumnA ColumnB
100 100
200 200
300 300
400 NULL
500 500

テーブルが上記の状態のとき、ColumnA、ColumnBに対して集合関数を使用してみると以下のような結果が出力される。

ColumnA

SUM MAX MIN AVG COUNT
1500 500 100 300 5

ColumnB

SUM MAX MIN AVG COUNT
1100 500 100 275 4

集合関数を使用する列にNULLが含まれる場合、AVGとCOUNTについてはNULLが無視された結果が出力される。 COUNTは「総レコード数-NULLレコード数」、AVGは「該当レコードの有効値の合計/(総レコード数-NULLレコード数)」なので、レコード数を基準に考えると正確な値は出力されない。

集合関数を使用する場合は、NULLを許容しない(NOT NULL)列だけで使用したり、列にデフォルト制約を使用してNULLが挿入されない状態を作るなどの前提を用意しておくべきだと思うんだけど、もし集合関数の結果にNULLのレコードを含みたい場合はCASE式が使える。

SELECT  AVG(Sub.ColB), COUNT(Sub.ColB)
FROM    (SELECT CASE WHEN ColumnB IS NULL THEN 0
                     ELSE   ColumnB
                     END AS ColB
         FROM   Table) Sub

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)