Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将KeyEvent从窗体发送到控件_C#_Vb.net_Datagridview_Contextmenu - Fatal编程技术网

C# 将KeyEvent从窗体发送到控件

C# 将KeyEvent从窗体发送到控件,c#,vb.net,datagridview,contextmenu,C#,Vb.net,Datagridview,Contextmenu,我有一个Windows.Worms应用程序。在我的一个表单中,我显示了一个DataGridView,其中有一个关联的ContextMenu(不是ContextMenuStrip)。上下文菜单中的菜单项定义了快捷方式 以下是创建ContextMenu的方式: Private _contextMenu As _ New ContextMenu( _ New MenuItem() { _ New MenuItem("Ite

我有一个Windows.Worms应用程序。在我的一个表单中,我显示了一个DataGridView,其中有一个关联的ContextMenu(不是ContextMenuStrip)。上下文菜单中的菜单项定义了快捷方式

以下是创建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项,则会调用单击。
现在,我希望快捷方式可以用于整个表单,即使DataGridView没有焦点。
相反的方法很简单,我只需将表单的KeyPreview设置为
true
。但我想将事件传递给我的DataGridView

我试图从DataGridView调用OnKeyDown和OnKeyPress方法,但这两种方法似乎都不起作用。我不知道,但我想ContextMenu忽略了键。。。事件并连接到消息队列,但我还没有掌握如何将System.Windows.Forms.KeyEventArgs转换为Windows消息的知识

只有两个人想:
-聚焦DataGridView,仅在我的尸体上使用SendKeys作为解决方案。

-我无法从上下文菜单中提取逻辑并使用KeyPreview或smth。像这样

我想你已经差不多明白了——试着将表单的KeyPreview设置为true,然后自己捕捉快捷键。当捕捉到正在按下的快捷键时,请调用相应的方法: (对不起,这是C#因为我更熟悉C#语法…)


嗯……这确实存在在两个不同位置处理快捷方式的问题……即:如果您将Ctrl+M添加到ContextMenu,您必须记住在KeyDown事件处理程序中也要处理它。也许可以完全从上下文菜单中删除快捷键,这样代码中就只有一个点可以处理快捷键?@yoopegeek:这就是重点。我无法将快捷方式从Contextmenu移动到表单,因为它是动态创建的,而表单不知道它的存在。
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(...);
   }
}