【问题标题】:cannot copy paste from datagridview无法从 datagridview 复制粘贴
【发布时间】:2024-01-19 23:51:02
【问题描述】:

我有一个简单的空白窗体作为测试项目 和一个数据网格视图 以及填充数据网格视图的查询

在这个测试项目中。我可以突出显示所有的列和行

点击 CTRL + C

打开excel

然后点击 ctrl + V

数据就在那里。

但是在我从公司某人那里继承的一个程序上 我有一个类似的数据网格视图。但我不能复制粘贴

我怎样才能确定这里有什么不同? 我检查了测试项目和我继承的程序的数据网格视图属性。两者具有相同的以下内容: 1.只读=假 2.copyclipboardmode = EnableWithAutoHeaderText

还有什么可以阻止我复制粘贴这个值?

在继承的程序中,复制粘贴的唯一方法是双击单元格并复制,但是。这限制了我一次复制一个单元格,而不是多个单元格

请指教?

谢谢

这是我的测试项目中的代码 sn-p

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    DataGridView1.Rows.Add(New String() {"TEST", "TEST2", "TEST3"})
    DataGridView1.Rows.Add(New String() {"TEST", "TEST2", "TEST3"})
    DataGridView1.Rows.Add(New String() {"TEST", "TEST2", "TEST3"})
    DataGridView1.Rows.Add(New String() {"TEST", "TEST2", "TEST3"})
    DataGridView1.Rows.Add(New String() {"TEST", "TEST2", "TEST3"})
    DataGridView1.Rows.Add(New String() {"TEST", "TEST2", "TEST3"})
    DataGridView1.Rows.Add(New String() {"TEST", "TEST2", "TEST3"})
End Sub

这是 QuickDanger 要求的 frmForm.Designer.vb

    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class frmForm
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.dgvSpecials = New System.Windows.Forms.DataGridView()
        Me.btnCreate = New System.Windows.Forms.Button()
        Me.PartCode = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.PDF = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.SLDDRW = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.SLDPRT = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.BasePartCode = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.TEMPLATESLDDRW = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.TEMPLATESLDPRT = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.TEMPLATEDRWFILE = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.TEMPLATEPRTFILE = New System.Windows.Forms.DataGridViewTextBoxColumn()
        Me.MakeSpecial = New System.Windows.Forms.DataGridViewCheckBoxColumn()
        CType(Me.dgvSpecials, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'dgvSpecials
        '
        Me.dgvSpecials.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
        Me.dgvSpecials.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.PartCode, Me.PDF, Me.SLDDRW, Me.SLDPRT, Me.BasePartCode, Me.TEMPLATESLDDRW, Me.TEMPLATESLDPRT, Me.TEMPLATEDRWFILE, Me.TEMPLATEPRTFILE, Me.MakeSpecial})
        Me.dgvSpecials.Dock = System.Windows.Forms.DockStyle.Fill
        Me.dgvSpecials.Location = New System.Drawing.Point(0, 0)
        Me.dgvSpecials.Name = "dgvSpecials"
        Me.dgvSpecials.Size = New System.Drawing.Size(917, 246)
        Me.dgvSpecials.TabIndex = 0
        '
        'btnCreate
        '
        Me.btnCreate.Dock = System.Windows.Forms.DockStyle.Bottom
        Me.btnCreate.Location = New System.Drawing.Point(0, 246)
        Me.btnCreate.Name = "btnCreate"
        Me.btnCreate.Size = New System.Drawing.Size(917, 30)
        Me.btnCreate.TabIndex = 1
        Me.btnCreate.Text = "Create"
        Me.btnCreate.UseVisualStyleBackColor = True
        '
        'PartCode
        '
        Me.PartCode.HeaderText = "Part Code"
        Me.PartCode.Name = "PartCode"
        Me.PartCode.ReadOnly = True
        Me.PartCode.Width = 200
        '
        'PDF
        '
        Me.PDF.HeaderText = "PDF"
        Me.PDF.Name = "PDF"
        Me.PDF.ReadOnly = True
        '
        'SLDDRW
        '
        Me.SLDDRW.HeaderText = "SLDDRW"
        Me.SLDDRW.Name = "SLDDRW"
        Me.SLDDRW.ReadOnly = True
        '
        'SLDPRT
        '
        Me.SLDPRT.HeaderText = "SLDPRT"
        Me.SLDPRT.Name = "SLDPRT"
        Me.SLDPRT.ReadOnly = True
        '
        'BasePartCode
        '
        Me.BasePartCode.HeaderText = "Base Part"
        Me.BasePartCode.Name = "BasePartCode"
        Me.BasePartCode.ReadOnly = True
        '
        'TEMPLATESLDDRW
        '
        Me.TEMPLATESLDDRW.HeaderText = "DRW Template"
        Me.TEMPLATESLDDRW.Name = "TEMPLATESLDDRW"
        Me.TEMPLATESLDDRW.ReadOnly = True
        '
        'TEMPLATESLDPRT
        '
        Me.TEMPLATESLDPRT.HeaderText = "PRT Template"
        Me.TEMPLATESLDPRT.Name = "TEMPLATESLDPRT"
        '
        'TEMPLATEDRWFILE
        '
        Me.TEMPLATEDRWFILE.HeaderText = "Column1"
        Me.TEMPLATEDRWFILE.Name = "TEMPLATEDRWFILE"
        Me.TEMPLATEDRWFILE.ReadOnly = True
        Me.TEMPLATEDRWFILE.Visible = False
        '
        'TEMPLATEPRTFILE
        '
        Me.TEMPLATEPRTFILE.HeaderText = "Column1"
        Me.TEMPLATEPRTFILE.Name = "TEMPLATEPRTFILE"
        Me.TEMPLATEPRTFILE.ReadOnly = True
        Me.TEMPLATEPRTFILE.Visible = False
        '
        'MakeSpecial
        '
        Me.MakeSpecial.HeaderText = "MakeSpecial"
        Me.MakeSpecial.Name = "MakeSpecial"
        '
        'frmForm
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(917, 276)
        Me.Controls.Add(Me.dgvSpecials)
        Me.Controls.Add(Me.btnCreate)
        Me.Name = "frmForm"
        Me.Text = "frmForm"
        CType(Me.dgvSpecials, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub
    Friend WithEvents dgvSpecials As System.Windows.Forms.DataGridView
    Friend WithEvents btnCreate As System.Windows.Forms.Button
    Friend WithEvents PartCode As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents PDF As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents SLDDRW As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents SLDPRT As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents BasePartCode As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents TEMPLATESLDDRW As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents TEMPLATESLDPRT As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents TEMPLATEDRWFILE As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents TEMPLATEPRTFILE As System.Windows.Forms.DataGridViewTextBoxColumn
    Friend WithEvents MakeSpecial As System.Windows.Forms.DataGridViewCheckBoxColumn
End Class

这是实际的 frmForm.VB SldWorks 是 SolidWorks.Interop.sldworks 的成员

Imports SolidWorks.Interop.sldworks

Public Class frmForm
    Dim App As SldWorks
    Public Sub Setup(App As SldWorks, Arr As ArrayList)

    End Sub

    Private Sub btnCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click

    End Sub
End Class

【问题讨论】:

  • 你试过WithoutAutoHeaderText 吗?你看到this 线程了吗?
  • 之前的开发者是否在代码中的其他地方劫持了 Copy 事件,然后在数据网格值可以发送到剪贴板之前将其设置为已处理?
  • 否,copyclipboardmode 属性未在代码中的任何位置设置。我发现的一个新发现是。他没有对数据网格视图进行数据绑定。但他只是使用 datagridview.rows.add(New String() {PartCode, PDF, STRING1, STRING2})。
  • 我使用类似的 .rows.add(new String(){"TEST"}) 制作了我的测试项目,我仍然可以在我的测试项目上复制粘贴。但不是在我继承的程序上。
  • 我会说 Ctrl+C 在某处被处理...

标签: vb.net excel datagridview


【解决方案1】:

我猜你必须将 DataGridView 的 MultiSelect 属性设置为 true

【讨论】:

    【解决方案2】:

    我猜你已经将ClipboardCopyMode 设置为Disable。将此属性更改为任何其他三个可用选项。

    【讨论】:

    • 复制剪贴板模式已设置为禁用以外
    【解决方案3】:

    其他开发人员在他的项目中使用 Ctrl+C 作为某些快捷键。 如果你可以查看他的设计,请通过 Menubar->ShortcutKeys 的属性

    【讨论】:

      【解决方案4】:

      看起来其他人已经成功使用ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText (见this SO question)。如果这没有帮助,您可以粘贴 dataGridView 的设计器代码吗? (在项目文件[formname].Designer.vb中找到)

      您可能还想在代码中搜索对该控件的引用,并验证原始开发人员在运行时没有修改ClipboardCopyMode 属性。

      编辑:由于所有建议似乎都不起作用,您可以使用制表符分隔的格式“滚动您自己的”复制/粘贴版本:

      注意:这会复制所有数据,而不仅仅是选定的单元格,但您可以将其修改为仅执行选定的单元格。

      Private Sub DataGridView1_KeyUp(sender As Object, e As KeyEventArgs) Handles DataGridView1.KeyUp
          If e.KeyCode = Keys.C AndAlso e.Control Then
              Dim sb = New StringBuilder()
      
              ' If you want the headers, keep these two lines
              Dim headers = DataGridView1.Columns.Cast(Of DataGridViewColumn)()
              sb.AppendLine(String.Join(vbTab, headers.[Select](Function(column) Convert.ToString(column.HeaderText)).ToArray()))
      
              For Each row As DataGridViewRow In DataGridView1.Rows
                  Dim cells = row.Cells.Cast(Of DataGridViewCell)()
                  sb.AppendLine(String.Join(vbTab, cells.[Select](Function(cell) Convert.ToString(cell.Value)).ToArray()))
              Next
              My.Computer.Clipboard.SetText(sb.ToString)
          End If
      End Sub
      

      【讨论】:

      • 搜索了 ClipboardCopyMode 的解决方案,但没有任何结果。我还按照原始帖子的要求添加了代码。谢谢
      • 查看我链接的 SO 问题。看起来将剪贴板复制模式更改为“EnableWithoutHeaderText”为这些用户解决了这个问题。通过右键单击 DataGridView 并选择属性,向下滚动到 ClipboardCopyMode,然后选择“EnableWithoutHeaderText”选项,我已经能够在不编辑 Designer.vb 文件的情况下执行此操作。根据您发布的designer.vb,您已将其保留在默认的“EnableWithAutoHeaderText”上,这就是它未显示在您的设计器文件中的原因。
      • 试过 EnableWithoutHeaderText - 我仍然无法复制粘贴。
      【解决方案5】:

      已解决:此问题是由于solidWorks.Interop.sldworks 和应用程序在Solidworks 环境中造成的

      我从其他 Solidworks 开发人员那里听说 ctrl C 拒绝工作

      【讨论】:

        【解决方案6】:

        为了从 datagridview 复制数据,我们遇到了多个错误。因此,我使用上面的 QuickDanger 帮助为我的应用程序开发了以下代码。

           Private Sub grdDetails_KeyUp(sender As Object, e As KeyEventArgs) Handles grdDetails.KeyUp
            Try
                If e.KeyCode = Keys.C AndAlso e.Control Then
                    Dim mGrid As DataGridView, mCol As DataGridViewColumn, mRow As DataGridViewRow, mCell As DataGridViewCell
                    Dim mStrBld As New StringBuilder
                    mGrid = CType(sender, DataGridView)
                    ' Copying Header 
                    For Each mCol In mGrid.Columns
                        If mCol.HeaderText IsNot Nothing Then
                            mStrBld.Append(vbTab & mCol.HeaderText)
                        Else
                            mStrBld.Append(vbTab & "")
                        End If
                    Next
                    mStrBld.Append(vbCrLf)
                    '  Copying Data
                    If mGrid.Rows.Count > 0 Then
                        'Display progress in Progress Bar if rows are more
                        'ProgressBar1.Minimum = 0 : ProgressBar1.Value = 0 : ProgressBar1.Maximum = mGrid.Rows.Count : ProgressBar1.Step = 1 : ProgressBar1.Visible = True
                        For Each mRow In mGrid.Rows
                            For Each mCell In mRow.Cells
                                If mCell IsNot Nothing AndAlso mCell.Value IsNot Nothing Then
                                    mStrBld.Append(vbTab & mCell.Value.ToString)
                                Else
                                    mStrBld.Append(vbTab & "")
                                End If
                            Next
                            mStrBld.Append(vbCrLf)
                            'ProgressBar1.PerformStep()
                        Next
                        ' sending data to clipboard, so we can safely past the same
                        My.Computer.Clipboard.SetText(mStrBld.ToString)
                        'ProgressBar1.Visible = False
                    Else
                        MsgBox("No Data...1", MsgBoxStyle.Critical)
                    End If
                End If
                    e.Handled = True
            Catch ex As Exception
                MsgBox("Error:" & ex.Message)
            End Try
        End Sub
        

        【讨论】: