Vb.net Datagridview未显示制表符

Vb.net Datagridview未显示制表符,vb.net,visual-studio,datagridview,datatable,Vb.net,Visual Studio,Datagridview,Datatable,我使用VisualBasic程序从另一个程序获取信息,我们称之为ProgramX ProgramX具有生成制表符分隔表的内置功能,许多用户将其复制到Excel。我的目标(我已经实现了)是生成并收集1000多个表,并准备好结果供用户一次复制/粘贴到Excel中,而不是一次复制/粘贴一个。我的数据集保留以制表符分隔的记录,正如我所希望的那样 问题是,当我在datagridview中显示dataset/datatable时,所有制表符都会被删除。当结果被复制/粘贴到Excel中时,它们占据一列,而不是

我使用VisualBasic程序从另一个程序获取信息,我们称之为ProgramX

ProgramX具有生成制表符分隔表的内置功能,许多用户将其复制到Excel。我的目标(我已经实现了)是生成并收集1000多个表,并准备好结果供用户一次复制/粘贴到Excel中,而不是一次复制/粘贴一个。我的数据集保留以制表符分隔的记录,正如我所希望的那样

问题是,当我在datagridview中显示dataset/datatable时,所有制表符都会被删除。当结果被复制/粘贴到Excel中时,它们占据一列,而不是自动断开。我一直在使用datagridview预览结果/复制到剪贴板;有没有办法在该视图中保留选项卡

预期结果:结果1[选项卡]结果2[选项卡]结果3

datatable中的结果:结果1[选项卡]结果2[选项卡]结果3

datagridview中的结果:结果1结果2结果3


如果实现这一点的唯一方法是直接从我的datatable复制,那么我已经看到了一些关于如何实现这一点的文章。谢谢

您有许多可用的选项,但在大多数情况下,您需要以某种方式执行一些循环-然而,即使有1000多条记录,它的性能也几乎不受影响

因此,对于前两个选项,让我们假设我有以下设置-与您的一个
DataGridViewColumn
idea保持一致:

Me.table = New DataTable()
Me.table.Columns.Add("Data", GetType(String))

For i As Integer = 0 To 999
    Dim x As Integer = i * 4
    Dim data As String = String.Format("Result {0}" & vbTab & "Result {1}" & vbTab & "Result {2}" & vbTab & "Result {3}", x + 1, x + 2, x + 3, x + 4)
    Me.table.Rows.Add(data)
Next

Me.dataGridView1.AllowUserToAddRows = False
Me.dataGridView1.DataSource = Me.table
可能的解决方案

  • 循环浏览
    数据表
    ,连接数据,并设置剪贴板文本:

    Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click
        Dim content As String = String.Empty
    
        For Each row As DataRow In Me.table.Rows
            content = String.Format("{0}" & vbLf & "{1}", content, row.ItemArray(0).ToString())
        Next
    
        content = content.TrimStart(ControlChars.Lf)
        Clipboard.SetText(content)
    End Sub
    
    Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click
        Dim content As String = String.Empty
    
        For Each row As DataGridViewRow In Me.dataGridView1.Rows
            content = String.Format("{0}" & vbLf & "{1}", content, row.Cells(0).Value.ToString())
        Next
    
        content = content.TrimStart(ControlChars.Lf)
        Clipboard.SetText(content)
    End Sub
    
  • 循环浏览
    DataGridView.Rows
    ,连接数据,并设置剪贴板文本:

    Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click
        Dim content As String = String.Empty
    
        For Each row As DataRow In Me.table.Rows
            content = String.Format("{0}" & vbLf & "{1}", content, row.ItemArray(0).ToString())
        Next
    
        content = content.TrimStart(ControlChars.Lf)
        Clipboard.SetText(content)
    End Sub
    
    Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click
        Dim content As String = String.Empty
    
        For Each row As DataGridViewRow In Me.dataGridView1.Rows
            content = String.Format("{0}" & vbLf & "{1}", content, row.Cells(0).Value.ToString())
        Next
    
        content = content.TrimStart(ControlChars.Lf)
        Clipboard.SetText(content)
    End Sub
    

    • 为了使选项1和2的网格看起来更好一些,因为显示似乎忽略了选项卡:

      Private Sub dataGridView1_CellFormatting(ByVal sender As Object, _
      ByVal e As DataGridViewCellFormattingEventArgs) _
      Handles dataGridView1.CellFormatting
          Dim value As String = e.Value.ToString().Replace(vbTab, "     ")
          e.Value = value
      End Sub
      
      这样,您的网格可能会如下所示:


  • 除了原始设置之外,不要绑定到原始的
    数据表
    ,而是按选项卡拆分表中的数据,并将其显示在单独的列中:

    Dim splitTable As New DataTable()
    
    For Each row As DataRow In Me.table.Rows
        Dim splitItems = row.ItemArray(0).ToString().Split(ControlChars.Tab)
    
        For i As Integer = splitTable.Columns.Count To splitItems.Length - 1
            splitTable.Columns.Add(String.Empty, GetType(String))
        Next
    
        splitTable.Rows.Add(splitItems)
    Next
    
    Me.dataGridView1.AllowUserToAddRows = False
    Me.dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText
    Me.dataGridView1.DataSource = splitTable
    
    然后,您可以对
    DataGridView
    使用内置剪贴板方法:

    Private Sub button1_Click(sender As Object, e As System.EventArgs) Handles button1.Click
        Me.dataGridView1.SelectAll()
        Clipboard.SetDataObject(Me.dataGridView1.GetClipboardContent())
    End Sub
    
    这样,您的网格可能会如下所示:


  • 对于所有三个选项,单击
    按钮1
    复制数据并在Excel中按Ctrl+V将生成:

    请注意


    优点:

    选项1和2保留用户选择的单元格不变。使用分隔的
    DataGridView
    列时,选项3看起来更好

    缺点:


    选项1和2在等待数据时看起来不那么干净。选项3选择所有单元格,丢失用户以前选择的单元格。

    1,是否在datagridview中显示所有这些表格?第二,展示如何定义数据集。第三,你说的制表符是什么意思?文本没有缩进?第四,展示你复制excel的方式。克劳迪斯,1。它们合并到一个表中并显示在datagridview中。2.一列,字符串。3.在文本组之间留出一些空间,这特别有用,因为excel在粘贴时会将其识别为“开始将其放入另一列”。4.如果datagridview中有多个列,则me.dgv.selectall()剪贴板.setdataobject(me.dgv.getclipboardcontent())不会更好。你在那里不会有任何问题。如果没有,可以用Chr(9)替换文本之间的一些空格,这是一个选项卡,该语句是错误的:“文本组之间的一些空格,特别有用,因为excel在粘贴时将其识别为“开始将其放在另一列中”,这也意味着:“有没有办法在该视图中保留选项卡?”在datatable/datagridview中有多个列更为理想,但按照我的方式,用户可以轻松地调整他们的表,而无需了解我正在编写的代码。我不确定我是否正确地解释了账单这件事。假设这样:当粘贴到excel中时,将我的datatable的第一行复制到剪贴板会导致10列…从datagridview复制会导致一列。我想这是因为dgv删除了[tab]。哇,非常感谢。多么彻底的回答啊。我选择了选项3。我确实将datatable列的创建移到了“For each row in table.rows”循环之外,但它在其他方面工作得非常出色!我以前在设置数据源方面没有任何运气,但我想我可能会跳过最初的表创建,直接从输入创建最终的分隔表。我正在研究15个“代表”点,但我肯定会回来作为参考。最好的答案!很高兴听到这个消息。我将列创建放在那里,因为我不确定您的列大小可能是多少,或者它们是否是可变的(值得怀疑,但我在谨慎方面犯了错误)。