0

我的 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 = DataGridView.GetClipboardContent();
            Clipboard.SetDataObject(d);
            e.Handled = true;
        }
    }

为什么这样?

Ctrl当我按下+时发生的屏幕截图C

在此处输入图像描述

4

2 回答 2

7

您的屏幕截图显示您检测到 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);
    }
}
于 2013-10-14T15:54:17.503 回答
2

如果您将断点放在if案例中,那么您将经常使用错误的信息来解决这个问题。除非你同时按下CtrlC

我正在使用这段代码来捕获Ctrl+ C(检查ModifierKeys):

private void DataGridView_KeyUp(object sender, KeyEventArgs e)
{
 if (e.Key == Key.C &&
     (Keyboard.Modifiers & ModifierKeys.Control) == (ModifierKeys.Control))
 {
   DataObject d = DataGridView.GetClipboardContent();
   Clipboard.SetDataObject(d);
   e.Handled = true;
  }
}

由于它是框架 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;
  }
}
于 2013-10-14T15:31:43.367 回答