DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridView上のコントロールのkeydownイベント

環境/言語:[WinXP .NetFramework2.0 VS2008]
分類:[.NET]

VisualStudio2008、VB.NETにて、Windowsアプリケーションを作成しています。

現在、DataGridView上に配置したPictureBoxにfocusが当たっている状態で、
PictureBoxのKeyDownイベントの処理を行った時、
DataGridViewのRowが1以上の場合、ctrl+Cを押下した時に
KeyDownイベントが発生しないという現象が起きました。
しかし、ctrl+Alt+Cだとイベントが発生します。

FormのKeyPreviewをTrueにしてみましたが、何も変わりませんでした。

どうにかこのような時のkeyDownイベントを取得する方法はありませんでしょうか。
もしありましたら、どうかご教示願います。

以下、検証に用いたコードです。
※デザイナにて、PictureBoxの親コントロールをDataGridViewになるようにしています。
Public Class Form

Private Sub form_load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
DataGridView1.Rows.Add()
Me.KeyPreview = True
End Sub

Private Sub PictureBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
CType(sender, PictureBox).Focus()
End Sub

Private Sub PictureBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles PictureBox1.KeyDown
If e.Control Then
If (e.KeyCode And Keys.C) = Keys.C Then
'Ctrl+Cが押下された場合
MsgBox("ccc")
Else
MsgBox("ddd")

End If
End If
End Sub

End Class
お疲れ様です。

当方環境ではPreviewKeyDownでうまくいきましたので
試してみてください。

Public Class Form_DGVPictureBoxKeyDownTest
    Inherits Form

    Dim _dgv As New DataGridView
    Dim WithEvents _picbox As New PictureBox

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Me._picbox.SetBounds(50, 50, 100, 100)
        With Me._dgv
            .RowCount = 10
            .ColumnCount = 5
            .Dock = DockStyle.Fill
            .Controls.Add(Me._picbox)
        End With
        Me.Controls.Add(Me._dgv)
        MyBase.OnLoad(e)
    End Sub

    Private Sub _picbox_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles _picbox.Click
        Trace.WriteLine("Focus")
        Me._picbox.Focus()
    End Sub

    Private Sub _picbox_PreviewKeyDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles _picbox.PreviewKeyDown
        Trace.WriteLine(e.KeyCode.ToString)
        If Control.ModifierKeys = Keys.Control AndAlso e.KeyCode = Keys.C Then
            Trace.WriteLine("CTRL+C")
        End If
    End Sub

End Class

DOBON.NET | プログラミング道 | プログラミング掲示板