我有一个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。像这样。
答案 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(...);
}
}