カスタマイズしていたパッケージソフトのコントールが不具合で使用できず、
急遽標準のグリッドに置き換えることになった。
なるべく動作を合わせなくてはならない。

「コンボボックス表示されるセルの値をDELキーでクリアする」という仕様で行き詰った。

DataGridViewのEditingControlShowingイベントでDataGridViewComboBoxEditingControlを取得して、
そのKeyDownイベントでSelectedIndex = -1を設定するところまでは、すぐに思いついた。

しかし、すでにセルに値が設定されていると、
フォーカスが離れた後に元の値に戻ってしまうのだ。
これには頭を抱えてしまった。

結局、編集終了後のCellEndEditイベントで、
SelectedIndex = -1ならセルに空文字を設定することにした。
その後DataGridViewComboBoxEditingControlへの参照をクリアしてしまうので、
CellEndEditイベントでは、DataGridViewComboBoxEditingControlへの参照が存在するかどうかをチェックすることにした。

サンプルはVB2008Exp、グリッドはアンバウンドです。
仕事でExpて悲しいでしょ・・・

''' DataGridViewに表示されるDataGridViewComboBox
Private WithEvents DataGridViewComboBox As DataGridViewComboBoxEditingControl = Nothing

'''カラムの列挙
Private Enum GridCol As Integer
Text = 0
Value = 1
End Enum

''' DataGridViewにDataGridViewComboBoxが表示されたら取得する
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing

If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then
Dim DGView As DataGridView = DirectCast(sender, DataGridView)

Me.DataGridViewComboBox = _
DirectCast(e.Control,DataGridViewComboBoxEditingControl)
End If
End Sub


''' DataGridViewComboBoxのイベントでDELキーを受け、リストをクリアする
Private Sub DataGridViewComboBox_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles DataGridViewComboBox.KeyDown

If e.Alt = False AndAlso e.Control = False AndAlso e.KeyCode = Keys.Delete Then
Dim DGVComboBox As DataGridViewComboBoxEditingControl = _
DirectCast(sender, DataGridViewComboBoxEditingControl)
DGVComboBox.SelectedIndex = -1
End If
End Sub


'''編集終了時にリストが選択されていなければ、
'''セルに空文字を入れて、 DataGridViewComboBoxを初期化
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGridView1.CellEndEdit

If Not Nothing Is Me.DataGridViewComboBox Then
If Me.DataGridViewComboBox.SelectedIndex = -1 Then
Dim DGView As DataGridView = _
DirectCast(sender, DataGridView)
DGView.Rows(e.RowIndex).Cells(GridCol.Value).Value = ""
End If

Me.DataGridViewComboBox = Nothing
End If
End Sub


※プログラム関係の記事がたまったら別ブログにしようと思います。