如何启用 copy-paste 从 Excel 到自定义 DataGridView?
How to enable copy-paste from Excel into custom DataGridView?
我试图在我自己的环境中解决这个老问题,采用了很多不同的解决方案,但仍然没有成功。
我有一个名为 EntryGrid
的 User Control
,它有一个 DataGridView
,它是 headers,这些都是在代码中设置的。然后有一个表格,上面有一个 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)
) 中创建了一个活动,但一切都变了。
我可以将剪贴板中的任何内容粘贴到单元格中,但在我开始修改之前这是可能的。
谢谢你的想法!
ProcessCmdKey
你的 UserControl
方法就是你要找的。覆盖它并检查 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);
}
我试图在我自己的环境中解决这个老问题,采用了很多不同的解决方案,但仍然没有成功。
我有一个名为 EntryGrid
的 User Control
,它有一个 DataGridView
,它是 headers,这些都是在代码中设置的。然后有一个表格,上面有一个 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)
) 中创建了一个活动,但一切都变了。
我可以将剪贴板中的任何内容粘贴到单元格中,但在我开始修改之前这是可能的。
谢谢你的想法!
ProcessCmdKey
你的 UserControl
方法就是你要找的。覆盖它并检查 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);
}