我有简单的.net应用程序,其中包含每个选项卡上的选项卡和datargridviews。我已经将主菜单添加到表单中,并使用标准属性将热键分配给菜单项:
editMenuItem = new ToolStripMenuItem("Copy", null, new System.EventHandler(onCopyCut_Click));
editMenuItem.ShortcutKeys = Keys.Control | Keys.C;
上面显示的菜单项只是将单元格内容复制到剪贴板。这很好但是在 DGV的编辑模式 Ctrl + C和其他标准热键不再有用了!
我已将Form.KeyPreview
属性设置为true,还尝试关闭我的Form对象的 Handled 属性,但没有任何反应:
void FileOrginizerForm_KeyDown(object sender, KeyEventArgs e)
{
...
if (gridView.CurrentCell.IsInEditMode)
e.Handled = false;
}
我缺少什么?我相信这应该是简单的事情。
我在msdn help page's comments找到了一些信息:
设置这些属性时需要记住的一件事是if 你的表单中有一个文本框控件,菜单项的ShortcutKeys会 截取密钥组合,文本框永远不会收到它,例如如果你 有一个粘贴(ctrl + v)ShortcutKey,你的文本框永远不会收到粘贴 命令即可。根据微软的说法,这是设计的。他们的解决方法是 暂时清除菜单项的ShortCutKey属性以允许粘贴 命令(最有可能在事件期间),然后在事件发生后重置它 结束。
SOLUTION:
不是打开和关闭菜单快捷方式,而是通过调用主Form的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();
}
}
}
答案 0 :(得分:1)
您可以使用下面演示中显示的两个事件暂时从菜单项中删除快捷方式。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
public class Form1 : Form
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
public Form1()
{
var dgv = new DataGridView
{
Dock = DockStyle.Fill,
DataSource = new List<DummyObject>
{
new DummyObject { Name = "One", Value = 1 },
new DummyObject { Name = "Two", Value = 2 },
new DummyObject { Name = "Three", Value = 3 },
}
};
dgv.EditingControlShowing += (s, e) => e.Control.VisibleChanged += DgvEditingControlVisibleChanged;
Controls.Add(dgv);
}
void DgvEditingControlVisibleChanged(object sender, EventArgs e)
{
Control control = sender as Control;
if (control.Visible)
{
// The editing control has become visible.
Trace.WriteLine(String.Format("Editing control showing {0}", control));
}
else
{
// The editing control has been removed.
// Remove the event handler because the DGV can use multiple
// editing controls if it has different column types.
control.VisibleChanged -= DgvEditingControlVisibleChanged;
Trace.WriteLine(String.Format("Editing control removed {0}", control));
}
}
}
public class DummyObject
{
public string Name { get; set; }
public int Value { get; set; }
}
答案 1 :(得分:1)
如果您将SendKeys.Send("^c");
添加到菜单项的click事件中,则无需从menuitem中删除快捷方式
答案 2 :(得分:0)
只需从菜单项中删除快捷方式,然后将其文本放在菜单项文本中即可。这适用于在表单上使用快捷方式,但如果单击菜单项本身,您仍需要编码