2009-06-18 78 views
0

我有一个Windows.Worms应用程序。在我的一种形式中,我使用与其关联的ContextMenu(而不是ContextMenuStrip)显示DataGridView。 ContextMenu中的MenuItems定义了快捷方式。从窗体发送KeyEvent到控件

这是文本菜单是如何创建的:

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忽略键...事件和挂钩到消息队列,但我没有得到如何将我的System.Windows.Forms.KeyEventArgs转换为Windows消息。

就在想:
- 聚焦在DataGridView和使用的SendKeys因为只有我死了一个解决方案。
- 我无法从ContextMenu中取出逻辑并使用KeyPreview或smth。喜欢这个。

回答

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(...); 
    } 
} 
+0

嗯...这是否有问题在两个独立的地方处理快捷方式...即:如果您将Ctrl + M添加到您的ContextMenu中,则必须记住在您的KeyDown事件处理程序中处理该快捷方式。 。 。 也许完全从ContextMenu中删除快捷键,所以处理快捷键的代码中只有一个点? – Yoopergeek 2009-06-18 14:25:45

+0

@Yoopergeek:就是这一点。我无法将快捷方式从Contextmenu移动到表单,因为它是动态创建的,表单不知道它是否存在。 – 2009-06-19 07:03:10