我有簡單的.net應用程序包含每個選項卡上的選項卡和datargridviews。我已經添加了主菜單的形式,並通過使用標準的財產分配熱鍵菜單項:如何在DataGridView編輯模式下製作工作標準熱鍵(Ctrl + C,Ctrl + Z)?
editMenuItem = new ToolStripMenuItem("Copy", null, new System.EventHandler(onCopyCut_Click));
editMenuItem.ShortcutKeys = Keys.Control | Keys.C;
以上只是複製單元格內容中顯示的菜單項目複製到剪貼板。這工作正常,但在DGV的編輯模式 Ctrl + C和其他標準熱鍵不再工作了!
我已經設置Form.KeyPreview
屬性爲true,還試圖關閉處理好物業我的窗體對象,但沒有任何反應:
void FileOrginizerForm_KeyDown(object sender, KeyEventArgs e)
{
...
if (gridView.CurrentCell.IsInEditMode)
e.Handled = false;
}
什麼我失蹤?我相信這應該是簡單的。
我發現msdn help page's comments一些信息:
一件事,你需要記住,當設置這些屬性是,如果 你有你的形式的文本框控件,菜單項的ShortcutKeys會 截取該組合鍵和文本框永遠不會收到它,例如如果你的 有粘貼(ctrl + v)ShortcutKey,你的文本框永遠不會收到粘貼 命令。據微軟稱,這是設計。他們的解決方法是 臨時清除菜單項的ShortCutKey屬性以允許粘貼 命令(最有可能在事件期間),然後在事件完成後重置該事件 。
SOLUTION:
相反的開啓和關閉的菜單快捷方式我結束了從主窗體的KeyDown事件處理程序調用菜單事件處理程序:
void FileOrginizerForm_KeyDown(object sender, KeyEventArgs e)
{
if (!gridView.CurrentCell.IsInEditMode)
{
if (e.KeyData == (Keys.Control | Keys.Z))
{
this.editToolStripMenuItem.DropDownItems["Undo"].PerformClick();
}
else if (e.KeyData == (Keys.Control | Keys.Y))
{
this.editToolStripMenuItem.DropDownItems["Redo"].PerformClick();
}
else if (e.KeyData == (Keys.Control | Keys.X))
{
this.editToolStripMenuItem.DropDownItems["Cut"].PerformClick();
}
else if (e.KeyData == (Keys.Control | Keys.C))
{
this.editToolStripMenuItem.DropDownItems["Copy"].PerformClick();
}
else if (e.KeyData == (Keys.Control | Keys.V))
{
this.editToolStripMenuItem.DropDownItems["Paste"].PerformClick();
}
else if (e.KeyData == (Keys.Control | Keys.A))
{
this.selectToolStripMenuItem.DropDownItems["Select All"].PerformClick();
}
}
}
當DGV進入「DataGridViewTextBoxColumn」(默認列類型)單元格的編輯模式時,它會創建一個「TextBox」控件並將其移動到單元格的區域中。正是這個控件('DataGridView.EditingControl')具有焦點。這個'TextBox'與窗體上的任何其他'TextBox'相同的快捷規則。 – Tergiver 2011-05-21 15:04:40
是的,但問題是'ToolStripMenuItem.ShortcutKeys'屬性重寫了'TextBox'的標準快捷方式。 – sergo 2011-05-21 15:32:21