【问题标题】:Datagridview not displaying tab characterDatagridview 不显示制表符
【发布时间】:2016-03-03 06:40:10
【问题描述】:

我使用一个 Visual Basic 程序从另一个程序(我们将其称为 ProgramX)获取信息。

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

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

预期结果:结果 1 [tab] 结果 2 [tab] 结果 3

数据表中的结果:结果 1 [tab] 结果 2 [tab] 结果 3

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

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

【问题讨论】:

  • 一,你在datagridview中显示所有这些表?第二,展示你是如何定义你的数据集的。三、制表符是什么意思?文字没有缩进?四、展示你复制到excel的方式。
  • Claudius, 1. 它们合并到一个表中并显示在 datagridview 中。 2. 一列,字符串。 3.文本组之间的一些空间,特别有用,因为excel在粘贴时将其识别为“开始将其放在不同的列中”。 4. me.dgv.selectall() clipboard.setdataobject(me.dgv.getclipboardcontent())
  • datagridview 中的列不要超过一列。你在那里不会有任何问题。如果不是,则可以用作为选项卡的 Chr(9) 替换文本之间的一些空格,并且此语句是错误的:“文本组之间的一些空格,特别有用,因为 excel 在粘贴时将其识别为“开始将其放在不同的列中” "
  • 这也意味着:“有什么方法可以保留此视图中的选项卡吗?”
  • 在 datatable/datagridview 中有多个列会更理想,但按照我的做法,用户可以轻松调整他们的表格,而无需进入我正在制作的代码.我不确定我是否正确解释了标签的内容。让我们这样说:将我的数据表的第一行复制到剪贴板会在粘贴到 excel 时产生 10 列...从 datagridview 复制会产生一列。我认为这是因为 dgv 删除了 [tab]。

标签: vb.net visual-studio datagridview datatable


【解决方案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
    

    这样你的网格可能看起来像:


  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
    

    这样你的网格可能看起来像:


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

注意Wrap Text will be on by default


优点:

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

缺点:

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

【讨论】:

  • 哇,非常感谢。多么令人难以置信的彻底答案。我选择了选项 3。我确实将数据表列的创建移到了“对于 table.rows 中的每一行”循环之外,但它在其他方面就像一个魅力!我之前设置数据源没有任何运气,但我想我可能会跳过初始表创建并直接从我的输入创建最终分隔表。我正在研究 15 个“代表”点,但我确定我会回来作为参考。最佳答案!
  • 很高兴听到这个消息。我将列创建放在那里是因为我不确定您的列大小可能是多少,或者它们是否完全可变(值得怀疑,但我在谨慎方面犯了错误)。
猜你喜欢
  • 2013-08-15
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多