注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。
DataGridViewの列にチェックボックスを表示するには、DataGridViewCheckBoxColumnを使用します。Boolean型(C#では、bool型)のデータをDataGridViewにバインドすれば自動的にDataGridViewCheckBoxColumnが使用されますので、特に問題は無いでしょう。
以下に、非バインド列としてチェックボックス列を追加する例を示します。
'CheckBox列を追加する Dim column As New DataGridViewCheckBoxColumn DataGridView1.Columns.Add(column)
//CheckBox列を追加する DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn(); DataGridView1.Columns.Add(column);
デフォルトでは、DataGridViewCheckBoxColumnはチェックされているかされていないかの2種類だけです。これに中間状態(何も設定されていない状態)を加えて3種類とするには、DataGridViewCheckBoxColumn.ThreeStateプロパティをTrueにします。
'3種類のチェック状態を表示できるようにする Dim column As DataGridViewCheckBoxColumn = _ CType(DataGridView1.Columns(0), DataGridViewCheckBoxColumn) column.ThreeState = True
//3種類のチェック状態を表示できるようにする DataGridViewCheckBoxColumn column = (DataGridViewCheckBoxColumn)DataGridView1.Columns[0]; column.ThreeState = true;
CheckState型のデータをバインドしても、3種類のチェック状態を表示できます。
チェックボックスにチェックが付けられた(あるいは、チェックが外された)ことを知るには、DataGridView.CellValueChangedイベントを使用します。ただしCellValueChangedイベントは、チェックボックスがチェックされた後に別のセルにフォーカスを移すなどして値がコミットされた時に発生します。チェックボックスがチェックされた直後にCellValueChangedイベントが発生するようにするには、CurrentCellDirtyStateChangedイベントハンドラでDataGridView.CommitEditメソッドを呼び出して値をコミットします。
以下に示す例では、インデックスが0の列がチェックボックス列となっているDataGridViewコントロール(DataGridView1)で、チェックボックスの値が変化した時に、何行目が変化したかを表示しています。なお、同様のサンプルは、「方法 : Windows フォーム DataGridView コントロールのボタン列にあるボタンを無効にする」にもあります。
'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
//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)); } }