A Day In The Life

とあるプログラマの備忘録

データグリッドのキーイベントが発生しない

データグリッドでキーイベントが発生しないという現象が起こります。

データグリッドProcessCmdKeyメソッドをオーバーライドして入力キーを拾えるようにします。

Public Class ExDataGrid
  Inherits System.Windows.Forms.DataGrid

 Public Event KeyEvent(ByVal keyData As System.Windows.Forms.Keys, _
              ByRef Cancel As Boolean)

 Protected Overrides Function ProcessCmdKey(ByRef msg As _
           System.Windows.Forms.Message, _
           ByVal keyData As System.Windows.Forms.Keys) As Boolean
  Dim blnCancel As Boolean

  Select Case keyData
   Case Keys.Return, Keys.Tab
    RaiseEvent KeyEvent(keyData, blnCancel)
     If blnCancel Then
      Return True
     End If
   Case ...その他拾いたいキーがあれば書く

  End Select

  Return MyBase.ProcessCmdKey(msg, keyData)

 End Function
End Class

上記例ではエンターキーとタブキーを拾っています。

あとはデータグリッドを使用しているフォームでKeyEventをハンドルすればOKです。

Private Sub DataGrid1_KeyEvent(ByVal keyData As _
   System.Windows.Forms.Keys, _
   ByRef Cancel As Boolean) Handles DataGrid1.KeyEvent

 'グリットが選択されているかどうか
 If DataGrid1.CurrentRowIndex <> -1 Then
  Select Case keyData
   Case Keys.Return
    ...処理
    Cancel = True
   Case Keys.Tab
    Me.SelectNextControl(DataGrid1, True, True, True, True)
    Cancel = True
  End Select
 End If

End Sub

とこんな感じです。