我有简单的.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