注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。
こちらで紹介したように、DataGridViewComboBoxColumnを使ってコンボボックスを表示した時、このコンボボックスのリストをドロップダウンさせるには、まずセルを選択するためにクリックし、さらにセルを編集状態にするためにクリックし、最後にドロップダウンさせるためにクリックするというように、3回クリックする必要があります。ここでは、これが一回のクリックで済むようにする方法を紹介します。
これを実現する方法は、「DataGridView: Implement Single click navigation to a DataGridView Combo Box Cell」で紹介されています。この方法は、CellEnterイベントハンドラで、SendKeys.Sendを使ってF4キーを送信するというものです。
以下にこの方法を使った例を示します。ここでは、"ComboBox"という名前の列がDataGridViewComboBoxColumnである時に、この列のコンボボックスのリストを一度のクリックでドロップダウンさせるようにしています。
'CellEnterイベントハンドラ Private Sub DataGridView1_CellEnter(ByVal sender As Object, _ ByVal e As DataGridViewCellEventArgs) _ Handles DataGridView1.CellEnter Dim dgv As DataGridView = CType(sender, DataGridView) If dgv.Columns(e.ColumnIndex).Name = "ComboBox" AndAlso _ TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn Then SendKeys.Send("{F4}") End If End Sub
//CellEnterイベントハンドラ private void DataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) { DataGridView dgv = (DataGridView)sender; if (dgv.Columns[e.ColumnIndex].Name == "ComboBox" && dgv.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn) { SendKeys.Send("{F4}"); } }
この方法ではCellEnterイベントを使用しているため、マウスでクリックしなくてもセルにフォーカスが移れば、リストがドロップダウンされます。マウスのクリックだけに反応するようにCellClickやCellMouseClick、CellMouseDown、CellMouseUpイベントなども使えそうですが、CellEnterイベントの代わりにこれらを使用した場合、現在フォーカスのあるコンボボックスのセルをクリックすると、ドロップダウンリストが出て、すぐに引っ込んでしまいます。
ALT+DOWN
SendKeys.Send("%{DOWN}")
で期待動作となりました
private void dataGridView3_CellClick(object sender, DataGridViewCellEventArgs e) {
if (e.ColumnIndex == 7) {
SendKeys.Send("{F4}");
}
}
DataGridViewComboBoxColumn列のセルをクリックして
フォーカス移動した場合、
元のカレントセルのCellEnterイベント→クリックしたセルのCellEnterイベント
と発生する(元のカレントセルをクリックした場合は1回だけ発生)ので、
DataGridViewのEnterイベントでCurrentCellプロパティの値をnullに
する処理を入れた方が安定するように思います。
F4キーを創出する代わりに、明示的に編集モードに切り替えて、
編集コントロールを取リ出してドロップダウンを出させる方法に
切り替えてみました。
dgv.BeginEdit(false);
var edt = dataGridView.EditingControl as DataGridViewComboBoxEditingControl;
edt.DroppedDown = true;