C# Ctrl+;C不';无法在Windows窗体应用程序中正常工作
我的DataGridView上有一个将数据复制到剪贴板的事件,但我的事件没有检测到Ctrl+C正确按下(我必须按Ctrl+C大约15次,才能使此事件检测到Ctrl+C按下) 代码如下:C# Ctrl+;C不';无法在Windows窗体应用程序中正常工作,c#,winforms,datagridview,copy-paste,C#,Winforms,Datagridview,Copy Paste,我的DataGridView上有一个将数据复制到剪贴板的事件,但我的事件没有检测到Ctrl+C正确按下(我必须按Ctrl+C大约15次,才能使此事件检测到Ctrl+C按下) 代码如下: private void DataGridView_KeyUp(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.Control | Keys.C)) { DataObject d
private void DataGridView_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.Control | Keys.C))
{
DataObject d = DataGridView.GetClipboardContent();
Clipboard.SetDataObject(d);
e.Handled = true;
}
}
为什么会这样
按下Ctrl+C时发生的情况的屏幕截图
如果您将断点放在
If
案例中,那么您将用错误的信息大量命中该案例。除非同时按Ctrl和C
我使用这段代码捕获Ctrl+C(检查):
因为它是框架2.0:
private void DataGridView_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.C && (Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
DataObject d = DataGridView.GetClipboardContent();
Clipboard.SetDataObject(d);
e.Handled = true;
}
}
您的屏幕截图显示您检测到正在释放Ctrl键。当然不是你想要的 不能使用KeyUp事件,DataGridView已经截取Ctrl+C供自己使用。并执行逻辑操作,将选定的单元格、列或行复制到剪贴板。确保它没有做你需要它做的事情 如果要覆盖它,则需要保持DGV的领先地位。这要求您从DataGridView派生自己的类并重写ProcessCmdKey()方法。将类添加到项目中,并使其如下所示:
using System;
using System.Windows.Forms;
class MyDataGridView : DataGridView {
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Control | Keys.C)) {
// Do stuff
//..
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
当你说它没有检测到它时,你是基于这样一个事实,即你在某处有一个断点,并且你正在尝试调试它吗?或者,您是在没有调试器的情况下运行它,而它没有检测到它吗?我在没有调试器的情况下运行,它可以工作十次按。您应该使用e.修饰符来检查是否按了Ctrl键。@Silvermind否,只有键\u UpNo这样的属性
e.key
在“KeyEventArgs e”上可以找到它。。编辑了我的问题以反映整个方法。我找不到对windows.input的引用。在框架2.0中编写。顺便说一句,好的。。您可以检查此链接:@JonasW我正在使用此(e.KeyCode==Keys.C&&(Control.ModifierKeys&Keys.Control)==Keys.Control)
,并且它不是每次都起作用,但如果我的DGV有自己的方法,为什么不将选定的单元格复制到剪贴板?或者我如何允许我的dgw执行此操作?@Greag.Deay我已经尝试过,看起来默认情况下启用了单元格复制功能
,为什么您看不到它工作?@KingKingClipboardCopyMode=EnableWithoutHeaderText
,并且它不会通过ctrl+c复制到剪贴板:(@Greag.Deay不确定为什么它对您不起作用,但对我起作用,尽管默认值是EnableWithAutoHeaderText
using System;
using System.Windows.Forms;
class MyDataGridView : DataGridView {
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Control | Keys.C)) {
// Do stuff
//..
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}