将KeyEvent从表单发送到控件

时间:2009-06-18 14:04:56

标签: c# vb.net datagridview contextmenu

我有一个Windows.Worms应用程序。在我的一个表单中,我显示一个DataGridView,其中包含与之关联的ContextMenu(而不是ContextMenuStrip)。 ContextMenu中的MenuItems已定义了快捷方式。

这就是ContextMenu的创建方式:

    Private _contextMenu As _
        New ContextMenu( _
            New MenuItem() { _
                New MenuItem("Item A", AddressOf ItemA_Click, Shortcut.CtrlA) With {.DefaultItem = True}, _
                New MenuItem("Item B", AddressOf ItemB_Click, Shortcut.CtrlB), _
                New MenuItem("Item C", AddressOf ItemC_Click, Shortcut.CtrlC), _
                ...
            }) _
        With {.Name = "MyContextMenu"}

如果我的DataGridView有焦点,我按Ctrl + A调用ItemA_Click 现在我希望快捷方式适用于我的整个表单,即使DataGridView没有焦点 相反的方式很简单,我只需要将表单的KeyPreview设置为true。但我想将事件传递给我的DataGridView。

我试图从DataGridView调用OnKeyDown和OnKeyPress方法,但两者似乎都不起作用。我不知道,但我认为ContextMenu忽略了Key ...事件并挂钩到消息队列,但我还没有得到如何将我的System.Windows.Forms.KeyEventArgs转换为Windows消息

只有两个人认为:
- 关注DataGridView并使用SendKeys作为解决方案,仅限于我的尸体 - 我无法将逻辑从ContextMenu中拉出来并使用KeyPreview或smth。像这样。

1 个答案:

答案 0 :(得分:1)

我认为你几乎已经弄明白了 - 尝试将表单的KeyPreview设置为true然后自己捕获快捷键。当您按下快捷键时,请调用适当的方法: (对不起,这是C#,因为我对C#语法比较熟悉......)

private void Form_KeyDown(object sender, KeyEventArgs e) { 
   if (e.Control && e.KeyCode == Keys.A) {
      ItemA_Click(...);
   } else if (e.Control && e.KeyCode == Keys.B) { 
      ItemB_Click(...);
   } else if (e.Control && e.KeyCode == Keys.C) { 
      ItemC_Click(...);
   }
}