首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在DataGridView中复制/粘贴

在DataGridView中复制/粘贴
EN

Stack Overflow用户
提问于 2020-04-21 23:01:18
回答 1查看 66关注 0票数 1

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

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

我得到的结果是:

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

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

回答已采纳

发布于 2020-04-22 01:05:34

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

我不认为Copy部件有问题,因为GetClipboardContent函数就可以完成这项工作。对于Paste部件,下面的代码片段从剪贴板获取数据,并粘贴从CurrentCell开始的单元格选择范围的值。超出范围的单元格将被修剪。

代码语言:javascript
运行
复制
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事件调用它们,如下所示:

代码语言:javascript
运行
复制
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
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61346638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档