2009-06-18 77 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