У меня есть простое приложение .net, содержащее вкладки и datargridview на каждой вкладке.Я добавил главное меню в форму и назначил горячие клавиши элементам меню, используя стандартное свойство:
editMenuItem = new ToolStripMenuItem("Copy", null, new System.EventHandler(onCopyCut_Click));
editMenuItem.ShortcutKeys = Keys.Control | Keys.C;
Показанный выше пункт меню просто копирует содержимое ячейки в буфер обмена.Это работает нормально, но в режиме редактирования DGV Ctrl + C и другие стандартные горячие клавиши больше не работают!
Я установил для свойства Form.KeyPreview
значение true, также пытался отключить Обработано свойство моего объекта Form, но ничего не происходит:
void FileOrginizerForm_KeyDown(object sender, KeyEventArgs e)
{
...
if (gridView.CurrentCell.IsInEditMode)
e.Handled = false;
}
Чего мне не хватает?Я уверен, что это должно быть что-то простое.
Я нашел некоторую информацию в комментариях msdn на странице помощи :
Одна вещь, которая вам нужнаИмейте в виду, что при настройке этих свойств, если у вас есть элемент управления текстовым полем в вашей форме, ShortcutKeys пункта меню будут перехватывать эту комбинацию клавиш, и текстовое поле никогда не получит ее, например, если у вас есть вставка (ctrl + v) ShortcutKey, Ваше текстовое поле никогда не получит команду вставки .По словам Microsoft, это по замыслу.Их обходной путь - временно очистить свойство ShortCutKey элемента меню, чтобы разрешить команду вставки (скорее всего, во время события), а затем сбросить его после завершения события.
РЕШЕНИЕ:
Вместо того, чтобы включать и выключать ярлыки меню, я заканчивал тем, что вызывал обработчики событий меню из основного обработчика событий 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();
}
}
}