セルにコンボボックスを表示する
セルにテキストを表示するだけでなく、ドロップダウンリストボックスを表示して、あらかじめ決められた値をリストから選択できるようにしたいことがあります。その場合は、目的の列のセルにコンボボックスを追加する必要があります。次の例では、DataGridViewコントロールの5番目の列にComboBoxコントロールを追加しています。
'---add columns to the DataGridView control--- DataGridView1.Columns.Add("ID", "Product ID") DataGridView1.Columns.Add("Name", "Product Name") DataGridView1.Columns.Add("Description", "Description") DataGridView1.Columns.Add("Price", "Price") '---create a new bindingsource control--- Dim bindingsource As New BindingSource '---add the items into the control--- bindingsource.Add("Type A") bindingsource.Add("Type B") bindingsource.Add("Type C") '---create a combobox column--- Dim comboBoxCol As New DataGridViewComboBoxColumn '---set the header--- comboBoxCol.HeaderText = "Types" '---data bind it--- comboBoxCol.DataSource = bindingsource '---add a combobox column to the DataGridView control--- DataGridView1.Columns.Add(comboBoxCol)
この出力結果を図11に示します。
上の例では、項目リストを含んだBindingSourceコントロールを、DataGridViewコントロール内のDataGridViewComboBoxColumnコントロールにバインドする方法を示しましたが、DataGridViewComboBoxColumnコントロールに項目を直接追加する方法もあります。
'---adding columns--- DataGridView1.Columns.Add("ID", "Product ID") DataGridView1.Columns.Add("Name", "Product Name") DataGridView1.Columns.Add("Description", "Description") DataGridView1.Columns.Add("Price", "Price") '---add a combobox column--- Dim comboBoxCol As New DataGridViewComboBoxColumn '---set the header text--- comboBoxCol.HeaderText = "Types" '---add items to it--- comboBoxCol.Items.Add("Type A") comboBoxCol.Items.Add("Type B") comboBoxCol.Items.Add("Type C") DataGridView1.Columns.Add(comboBoxCol)
後者の方がより柔軟であり、この方法で実装していると、実行時にユーザーがドロップダウンリストに新しい項目を追加できます(詳細については次のセクションを参照)。ComboBoxコントロールにデータソースをバインドすると、新しい項目を実行時に追加できなくなります。
DataGridViewComboBoxColumnコントロールに項目を追加する
前のセクションでは、DataGridViewコントロール内のセルにComboBoxコントロールを表示する方法を示しました。ComboBoxコントロールにユーザーが新しい項目を挿入できるようにしたいことがあります。そのためには、少し準備が必要です。
まず、DataGridViewコントロールのEditingControlShowingイベントを処理します。このイベントは、ユーザーがComboBoxコントロールを編集しようとしたときに発生します。
Private Sub DataGridView1_EditingControlShowing( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms. _ DataGridViewEditingControlShowingEventArgs) _ Handles DataGridView1.EditingControlShowing Dim comboBoxColumn As DataGridViewComboBoxColumn = _ DataGridView1.Columns(4) If (DataGridView1.CurrentCellAddress.X = _ comboBoxColumn.DisplayIndex) Then Dim cb As ComboBox = e.Control If (cb IsNot Nothing) Then cb.DropDownStyle = ComboBoxStyle.DropDown End If End If End Sub
ここでのポイントは、編集対象のセルがComboBoxを含むセルかどうかを確認することです。ComboBoxを含んでいる場合は、ComboBoxコントロールのドロップダウンスタイルを「DropDown」に設定して、ユーザーによる追加入力ができるようにします。
次に、DataGridViewコントロールのCellValidatingイベントを処理します。このイベントはユーザーが入力を終了してセルを離れたときに発生します。
Private Sub DataGridView1_CellValidating( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms. _ DataGridViewCellValidatingEventArgs) _ Handles DataGridView1.CellValidating Dim comboBoxColumn As DataGridViewComboBoxColumn = _ DataGridView1.Columns(4) If (e.ColumnIndex = comboBoxColumn.DisplayIndex) Then If (Not comboBoxColumn.Items.Contains( _ e.FormattedValue)) Then comboBoxColumn.Items.Add(e.FormattedValue) End If End If End Sub
ここでは、通常のチェックを行った後に、新しく入力された項目をComboBoxに追加します。図12を見ると、ComboBoxには最初3個の項目があります。ここにユーザーが新しい項目(例えば、「Type D」)を入力でき、それがリストに追加されます。実際に操作した行より前または後ろの行でも、ComboBoxコントロールの項目数が4になることに注意してください。
行/列をロックする
行のReadOnlyプロパティをTrueに設定すると、特定の行が変更されないようにロックできます。
'---first row is readonly--- DataGridView1.Rows(0).ReadOnly = True
同様に、特定の列に属するセルをロックすることもできます。
'---first column is readonly--- DataGridView1.Columns(0).ReadOnly = True
ReadOnlyプロパティをTrueに設定するとセルの値は変更されなくなりますが、行の削除ができなくなるわけではありません。
必要ならDataGridViewコントロール全体をロックすることもできます。
'---entire grid is readonly--- DataGridView1.ReadOnly = True
列を非表示にする
実行時に列のVisibleプロパティをFalseに設定することで、特定の列を非表示にできます。
'---hides the second column--- DataGridView1.Columns(1).Visible = False
図13に、列を非表示にしたDataGridViewの例を示します。奥はすべての列を表示した状態で、手前は2番目の列(CompanyName列)を非表示にした状態です。



