【问题标题】:How to enable copy-paste from Excel into custom DataGridView?如何启用从 Excel 复制粘贴到自定义 DataGridView?
【发布时间】:2017-03-02 22:21:51
【问题描述】:

我正在尝试在自己的环境中解决这个老问题,适应了许多不同的解决方案,但仍然没有成功。
我有一个User Control,名为EntryGrid,它有一个DataGridView,它的标题和代码中设置了这样的东西。然后有一个表单,其中包含一个EntryGrid
我知道必须准备好 excel 列才能将所有单元格粘贴到一行中,为此我使用了这个解决方案:copypaste,除了复制部分。这是我家的样子:

Private Sub EntryGrid_KeyDown(sender As Object, e As KeyEventArgs) Handles EntryGrid4.KeyDown, EntryGrid8.KeyDown, EntryGrid16.KeyDown, EntryGrid32.KeyDown
        e.Handled = True
        Dim entryGrid As EntryGrid = sender
        Dim dataGrid As DataGridView = entryGrid.DataGrid
        If (e.Control And e.KeyCode = Keys.V) Then
           MessageBox.Show("Success")               'for now
        End If
End Sub

这绝对不适合我。我什至在表单中将KeyPreview 设置为True,但什么也没发生。
然后我尝试了this solution,我的任何结果:

Private Sub EntryGrid_EditingControlShowing(sender As System.Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles EntryGrid4.EditingControlShowing
        AddHandler e.Control.KeyDown, AddressOf cell_KeyDown
    End Sub

    Private Sub cell_KeyDown(sender As Object, e As KeyEventArgs)
        If e.KeyCode = Keys.V Then
            MessageBox.Show("Success")
        End If
    End Sub

EntryGrid4 是窗体上的用户控件的名称,但它没有任何EditingControlShowing 事件,只有DataGridView 有,但我不能这样使用:EntryGrid4.DataGrid.EditingControlShowing
我在 EntryGrid (Public Event EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs)) 中创建了一个活动,但一切都发生了变化。
我可以将剪贴板中的任何内容粘贴到单元格中,但在我开始修改之前这是可能的。 感谢您的任何想法!

【问题讨论】:

  • 到底是什么问题?它只是在处于编辑模式的单元格中粘贴一个值还是其他?请改写问题并使其更清晰,并删除与问题无关的部分。例如,如果问题是关于在编辑模式下从剪贴板粘贴到单元格,您应该确定要如何粘贴,使用键盘快捷键或使用菜单。这也是你要问的,你不需要描述用户控制结构或excel列等等。请保持问题简单而具体。
  • 问题是这两种尝试中的任何一种都有效,如果您可以提供帮助,请这样做。我想使用 Ctrl+V。

标签: excel vb.net winforms datagridview copy-paste


【解决方案1】:

UserControlProcessCmdKey 方法是您正在寻找的。覆盖它并检查 Ctrl + V 并执行您需要的操作。例如:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Control | Keys.V))
    {
        if (dataGridView1.EditingControl != null)
            dataGridView1.EditingControl.Text = Clipboard.GetText();
        else if (dataGridView1.CurrentCell != null)
            this.dataGridView1.CurrentCell.Value = Clipboard.GetText();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

【讨论】:

  • 哇,太有用了!我翻译成 Visual Basic 并把 excel 行处理代码,它工作。非常感谢您提出这个 processCmdKey 方法,任何其他来源都没有提到它与从 excel 复制粘贴到 datagridview 相关。
  • 糟糕,我完全错过了 VB.NET 标签。不客气:)