DOBON.NET

DataGridViewのコンボボックスのドロップダウンリストが一回のクリックで表示されるようにする

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

こちらで紹介したように、DataGridViewComboBoxColumnを使ってコンボボックスを表示した時、このコンボボックスのリストをドロップダウンさせるには、まずセルを選択するためにクリックし、さらにセルを編集状態にするためにクリックし、最後にドロップダウンさせるためにクリックするというように、3回クリックする必要があります。ここでは、これが一回のクリックで済むようにする方法を紹介します。

これを実現する方法は、「DataGridView: Implement Single click navigation to a DataGridView Combo Box Cell」で紹介されています。この方法は、CellEnterイベントハンドラで、SendKeys.Sendを使ってF4キーを送信するというものです。

以下にこの方法を使った例を示します。ここでは、"ComboBox"という名前の列がDataGridViewComboBoxColumnである時に、この列のコンボボックスのリストを一度のクリックでドロップダウンさせるようにしています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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イベントの代わりにこれらを使用した場合、現在フォーカスのあるコンボボックスのセルをクリックすると、ドロップダウンリストが出て、すぐに引っ込んでしまいます。

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

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

この記事への評価
良い / 悪い = 26 / 3

この記事へのコメント
通常のコメント [ 匿名 ] 2022年10月3日 05:00:37
EnterイベントのF4だとなぜか動作しないので
ALT+DOWN
SendKeys.Send("%{DOWN}")
で期待動作となりました

通常のコメント [ ger531 ] 2022年5月20日 22:56:15
うまく動かなかったのでこうしてみました。

private void dataGridView3_CellClick(object sender, DataGridViewCellEventArgs e) {
if (e.ColumnIndex == 7) {
SendKeys.Send("{F4}");
}
}

通常のコメント [ 匿名 ] 2017年6月9日 02:43:53
Alt+クリックでダイアログが閉じます。

通常のコメント [ 匿名 ] 2016年11月1日 03:59:02
DataGridView以外のコントロールがフォーカスされた状態から、
DataGridViewComboBoxColumn列のセルをクリックして
フォーカス移動した場合、
元のカレントセルのCellEnterイベント→クリックしたセルのCellEnterイベント
と発生する(元のカレントセルをクリックした場合は1回だけ発生)ので、
DataGridViewのEnterイベントでCurrentCellプロパティの値をnullに
する処理を入れた方が安定するように思います。

通常のコメント [ 匿名 ] 2015年6月4日 03:08:08
私のところでは、F4キーを別の用途に使いたいときに競合してしまったので、
F4キーを創出する代わりに、明示的に編集モードに切り替えて、
編集コントロールを取リ出してドロップダウンを出させる方法に
切り替えてみました。

dgv.BeginEdit(false);
var edt = dataGridView.EditingControl as DataGridViewComboBoxEditingControl;
edt.DroppedDown = true;


この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。