【问题标题】:Copy/Paste within DataGridView在 DataGridView 中复制/粘贴
【发布时间】:2023-09-11 21:20:02
【问题描述】:

我正在尝试在 DataGridView 中进行复制和粘贴,以类似于 Excel。我当前的代码执行此操作,但第一个单元格除外,它似乎将剪贴板中的所有内容粘贴到第一个单元格中。下面是我在cell_keydown 事件中使用的代码。

为了澄清,如果我复制以下内容:

我得到了结果:

在单击单元格之前,粘贴的数据在两个日期之间确实有一个空格。

如果有人有更好的方法来完成我最终想要做的事情,那也将不胜感激!

If e.Control AndAlso e.KeyCode = Keys.C Then
    Dim d As DataObject = dgv1.GetClipboardContent()
    Clipboard.SetDataObject(d)
    e.Handled = True

ElseIf e.Control AndAlso e.KeyCode = Keys.V Then
    Dim s As String = Clipboard.GetText().Replace(vbCr, " ")
    Dim lines As String() = s.Trim.Split(vbLf)
    Dim row As Integer = dgv1.CurrentCell.RowIndex
    Dim col As Integer = dgv1.CurrentCell.ColumnIndex
    Dim linesCount As Integer = lines.Count()

    If (row + linesCount) - dgv1.RowCount > 0 Then dgv1.Rows.Add((row + linesCount) - dgv1.RowCount)

    For Each line As String In lines
        If line.Length > 0 Then
            Dim cells As String() = line.Split(vbTab)
            For i As Integer = 0 To cells.GetLength(0) - 1
                dgv1.CurrentCell.Value = cells(i)
                If col + i < dgv1.ColumnCount Then
                    dgv1(col + i, row).Value = cells(i)
                Else
                    Exit For
                End If
            Next
            row += 1
        Else
            Exit For
        End If
    Next
End If

【问题讨论】:

    标签: vb.net datagridview copy-paste


    【解决方案1】:

    最好为复制/粘贴例程创建方法,以便您可以从代码中的不同位置调用它们,例如按钮单击、按键、菜单项单击...等。

    我认为Copy 部分没有问题,因为GetClipboardContent 函数可以完成这项工作。至于Paste 部分,以下代码 sn-p 从剪贴板中获取数据,并粘贴从 CurrentCell 开始的单元格选择范围的值。超出范围的单元格被修剪。

    Private Sub CopyCells()
        Clipboard.SetDataObject(DataGridView1.GetClipboardContent)
    End Sub
    
    Private Sub PasteCells()
        Dim s = Clipboard.GetText
        Dim ci = DataGridView1.CurrentCell.ColumnIndex
        Dim ri = DataGridView1.CurrentCell.RowIndex
        Dim colCount = DataGridView1.Columns.Count
        Dim rowCount = DataGridView1.Rows.Count
    
        For Each r In s.Split({ControlChars.CrLf}, StringSplitOptions.None)
            Dim Cell = ci
            For Each c In r.Split({ControlChars.Tab}, StringSplitOptions.None)
                If Cell >= colCount Then Exit For
                DataGridView1(Cell, ri).Value = c
                Cell += 1
            Next
            ri += 1
            If ri >= rowCount Then Exit For
        Next
    End Sub
    

    从 DGV.KeyDown 事件中调用它们,例如如下:

    Private Sub DataGridView1_KeyDown(sender As Object, e As KeyEventArgs) Handles DataGridView1.KeyDown
        If e.Control Then
            Select Case e.KeyCode
                Case Keys.C
                    CopyCells()
                    e.Handled = True
                Case Keys.V
                    PasteCells()
                    e.Handled = True
            End Select
        End If
    End Sub
    

    【讨论】:

    • 非常感谢您的解释。