Datagridview不显示制表符

时间:2016-03-02 14:02:25

标签: vb.net visual-studio datagridview datatable

我使用可视化基础程序从另一个程序中获取信息,我们称之为ProgramX。

ProgramX内置了生成制表符分隔表的功能,许多用户将其复制到Excel。我的目标(我已经实现过)是生成并收集超过1,000个这样的表格,并且结果准备好让用户一次复制/粘贴到Excel中,而不是一次一个。我的数据集按照我的意愿保留制表符分隔的记录。

问题在于,当我在datagridview中显示数据集/数据表时,将删除所有制表符。将结果复制/粘贴到Excel中时,它们会占用一列而不是自动分解。我一直在使用datagridview来预览结果/复制到剪贴板;有没有办法在此视图中保留选项卡?

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

数据表中的结果:结果1 [选项卡]结果2 [选项卡]结果3

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

如果实现这一目标的唯一方法是直接从我的数据表中复制,我已经看到了一些关于如何实现这一目标的帖子。谢谢!

1 个答案:

答案 0 :(得分:1)

您有多种选择,但在大多数情况下,您需要以某种方式执行某些循环 - 但即使有1000多条记录,它的性能也几乎不会受到影响。

因此,对于前几个选项,我们假设我有以下设置 - 保持您的DataGridViewColumn一个想法:

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

可能的解决方案

  1. 循环遍历DataTable,连接数据并设置剪贴板文本:

    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
    
  2. 循环遍历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 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
      

      您的网格可能如下所示:

      dgv with one column

    1. 除了原始设置,而不是绑定到原始DataTable,请按标签拆分表格数据并将其显示在不同的列中:

      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
      

      您的网格可能如下所示:

      dgv with multiple columns

    2. 对于所有三个选项,单击button1复制数据并在Excel中按 Ctrl + V 将产生:

      excel results

      请注意Wrap Text will be on by default

      <强>优点:

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

      <强>缺点:

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