DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DataGridViewの列にチェックボックスを表示する

注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。

DataGridViewの列にチェックボックスを表示するには、DataGridViewCheckBoxColumnを使用します。Boolean型(C#では、bool型)のデータをDataGridViewにバインドすれば自動的にDataGridViewCheckBoxColumnが使用されますので、特に問題は無いでしょう。

DataGridViewCheckBoxColumn

以下に、非バインド列としてチェックボックス列を追加する例を示します。

VB.NET
コードを隠すコードを選択
'CheckBox列を追加する
Dim column As New DataGridViewCheckBoxColumn
DataGridView1.Columns.Add(column)
C#
コードを隠すコードを選択
//CheckBox列を追加する
DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn();
DataGridView1.Columns.Add(column);

中間状態を含む3種類のチェック状態を表示できるようにする

デフォルトでは、DataGridViewCheckBoxColumnはチェックされているかされていないかの2種類だけです。これに中間状態(何も設定されていない状態)を加えて3種類とするには、DataGridViewCheckBoxColumn.ThreeStateプロパティをTrueにします。

VB.NET
コードを隠すコードを選択
'3種類のチェック状態を表示できるようにする
Dim column As DataGridViewCheckBoxColumn = _
    CType(DataGridView1.Columns(0), DataGridViewCheckBoxColumn)
column.ThreeState = True
C#
コードを隠すコードを選択
//3種類のチェック状態を表示できるようにする
DataGridViewCheckBoxColumn column =
    (DataGridViewCheckBoxColumn)DataGridView1.Columns[0];
column.ThreeState = true;

CheckState型のデータをバインドしても、3種類のチェック状態を表示できます。

チェックボックスにチェックが付けられた(あるいはチェックが外された)ことを知る

チェックボックスにチェックが付けられた(あるいは、チェックが外された)ことを知るには、DataGridView.CellValueChangedイベントを使用します。ただしCellValueChangedイベントは、チェックボックスがチェックされた後に別のセルにフォーカスを移すなどして値がコミットされた時に発生します。チェックボックスがチェックされた直後にCellValueChangedイベントが発生するようにするには、CurrentCellDirtyStateChangedイベントハンドラでDataGridView.CommitEditメソッドを呼び出して値をコミットします。

以下に示す例では、インデックスが0の列がチェックボックス列となっているDataGridViewコントロール(DataGridView1)で、チェックボックスの値が変化した時に、何行目が変化したかを表示しています。なお、同様のサンプルは、「方法 : Windows フォーム DataGridView コントロールのボタン列にあるボタンを無効にする」にもあります。

VB.NET
コードを隠すコードを選択
'CurrentCellDirtyStateChangedイベントハンドラ
Private Sub DataGridView1_CurrentCellDirtyStateChanged( _
        ByVal sender As Object, ByVal e As EventArgs) _
        Handles DataGridView1.CurrentCellDirtyStateChanged
    If DataGridView1.CurrentCellAddress.X = 0 AndAlso _
        DataGridView1.IsCurrentCellDirty Then
        'コミットする
        DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
    End If
End Sub

'CellValueChangedイベントハンドラ
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellValueChanged
    '列のインデックスを確認する
    If e.ColumnIndex = 0 Then
        MessageBox.Show( _
            String.Format("{0}行目のチェックボックスが{1}に変わりました。", _
            e.RowIndex, DataGridView1(e.ColumnIndex, e.RowIndex).Value))
    End If
End Sub
C#
コードを隠すコードを選択
//CurrentCellDirtyStateChangedイベントハンドラ
private void DataGridView1_CurrentCellDirtyStateChanged(
    object sender, EventArgs e)
{
    if (DataGridView1.CurrentCellAddress.X == 0 &&
        DataGridView1.IsCurrentCellDirty)
    {
        //コミットする
        DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

//CellValueChangedイベントハンドラ
private void DataGridView1_CellValueChanged(
    object sender, DataGridViewCellEventArgs e)
{
    //列のインデックスを確認する
    if (e.ColumnIndex == 0)
    {
        MessageBox.Show(
            string.Format("{0}行目のチェックボックスが{1}に変わりました。",
            e.RowIndex,
            DataGridView1[e.ColumnIndex, e.RowIndex].Value));
    }
}
  • 履歴:
  • 2010/11/30 CellValueChangedイベントハンドラで、列がbool型か調べるのをやめた。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。