解决C# DataGridView控件中使用组合键不响应问题

我们在使用DataGridView控件时,可能会有将一行的全部数据复制到另一行的需求,但是通过重写ProcessCmdKey接口后,使用组合键(Ctrl + C、Ctrl + V)不响应。
首先实现一下复制和粘贴一行的数据的代码逻辑。
m_CopyRow 为选中行的索引。
keyData == (Keys.C | Keys.Control) 为组合键(Ctrl + C)。
keyData == (Keys.V | Keys.Control) 为组合键(Ctrl + V)。

private int m_CopyRow = -1;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.C | Keys.Control) 
        && dataGridView.SelectedCells.Count > 0
        && !dataGridView.SelectedCells[0].IsInEditMode)
    {
        m_CopyRow = dataGridView.SelectedCells[0].RowIndex;
    }
    else if (keyData == (Keys.V | Keys.Control) 
        && dataGridView.SelectedCells.Count > 0
        && !dataGridView.SelectedCells[0].IsInEditMode)
    {
        IDataObject idataObject = Clipboard.GetDataObject();
        string[] s = idataObject.GetFormats();
        string data;
        if (!s.Any(f => f == "OEMText"))
        {
            if (!s.Any(f => f == "HTML Format"))
            {
            }
            else
            {
                data = idataObject.GetData("System.String").ToString();//多个单元格
                copyClipboardHtmltoGrid(data);
                msg = new Message();
                return base.ProcessCmdKey(ref msg, Keys.Control);
            }
        }
        else
        {
            data = idataObject.GetData("OEMText").ToString();//单个单元格,处于未编辑状态
            int rowStart = dataGridView.SelectedCells[0].RowIndex;
            int columnStart = dataGridView.SelectedCells[0].ColumnIndex;
            dataGridView.Rows[rowStart].Cells[columnStart].Value = data;
            return base.ProcessCmdKey(ref msg, Keys.Control);
        }
        m_CopyRow = -1;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

我的dataGridView中一共有四列,我需要把一行中所有的数据进行复制。所以一对一赋值。

private void copyClipboardHtmltoGrid(string data)
{
    string[] rows = data.Split(new string[] { "\r\n" }, StringSplitOptions.None);
    int rowStart = 0;
    if (this.dataGridView.SelectedCells.Count > 0)
    {
        rowStart = this.dataGridView.SelectedCells[0].RowIndex;
    	dataGridView.Rows[rowStart].Cells[0].Value = dataGridView.Rows[m_CopyRow].Cells[0].Value;
    	dataGridView.Rows[rowStart].Cells[1].Value = dataGridView.Rows[m_CopyRow].Cells[1].Value;
    	dataGridView.Rows[rowStart].Cells[2].Value = dataGridView.Rows[m_CopyRow].Cells[2].Value;
    	dataGridView.Rows[rowStart].Cells[3].Value = dataGridView.Rows[m_CopyRow].Cells[3].Value;
    }
}

组合键不响应问题解决
1.一开始我是这么写的 keyData == (Keys.Control | Keys.C),网上说写成 keyData == (Keys.C | Keys.Control )就可以响应了,但是我试了以后仍然不起作用。
2.又有人说把主窗体的keypreview属性设置为true,我设置了也不起作用。
3.于是在DataGridView控件本身上找原因,发现DataGridView的EditMode属性我最开始设置的是EditOneEnter,把它设置成EditOnKeystrokeOrF2就可以响应了。
分析原因:
可能是设置成EditOneEnter,鼠标点击这一行中某一个数据时,会优先响应单击事件,就没法使组合键起作用,所以改成EditOnKeystrokeOrF2就把避免了这种情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值