【发布时间】:2015-09-22 15:49:40
【问题描述】:
我不是在问如何将数据网格复制到我的剪贴板,而是更多地优化我的代码。
这是我必须将我的 datagridview 复制到剪贴板的内容,以便我可以将其内容粘贴到 excel 中。
Dim dgv As DataGridView = dgvData
Dim s As String = ""
Dim oCurrentCol As DataGridViewColumn 'Get header
oCurrentCol = dgv.Columns.GetFirstColumn(DataGridViewElementStates.Visible)
oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
Do
s &= oCurrentCol.HeaderText & Chr(Keys.Tab)
oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
Loop Until oCurrentCol Is Nothing
s = s.Substring(0, s.Length - 1)
s &= Environment.NewLine 'Get rows
For Each row As DataGridViewRow In dgv.Rows
oCurrentCol = dgv.Columns.GetFirstColumn(DataGridViewElementStates.Visible)
oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
Do
If row.Cells(oCurrentCol.Index).Value IsNot Nothing Then
s &= row.Cells(oCurrentCol.Index).Value.ToString
End If
s &= Chr(Keys.Tab)
oCurrentCol = dgv.Columns.GetNextColumn(oCurrentCol, DataGridViewElementStates.Visible, DataGridViewElementStates.None)
Loop Until oCurrentCol Is Nothing
s = s.Substring(0, s.Length - 1)
s &= Environment.NewLine
Next 'Put to clipboard
Dim o As New DataObject
o.SetText(s)
Clipboard.SetDataObject(o, True)
这很好用!完全符合我的要求,包括省略第一列,并且在粘贴到 Excel 时看起来很完美。
现在我遇到的问题是它非常慢。在我的开发计算机上,复制大约 10,000 行 10 列大约需要两分钟。在我们的一些较旧的服务器上,我让它运行了十多分钟,最终只是终止了该进程,因为它花费了很长时间。
我不知道我可以做些什么来加快这个过程。任何帮助表示赞赏!
谢谢!
【问题讨论】:
-
在那个大小下,跳过剪贴板并将内容写入文件可能会更好。也就是说,StringBuilder 可能会有所帮助。
-
除了非常非常基础的 StringBuilder 之外,我没有大量的经验,但是有没有办法可以将内容附加到字符串中,以便用户能够将内容粘贴到 Excel 中电子表格来模仿 datagridview?
-
StringBuilder 使用起来非常简单:
s.Append(blah blah blah)最后将其转换为字符串:s.ToString()。 -
首先,您的
GetFirstColumn(和类似的)方法似乎效率很低。您最好只遍历所有列/行并通过检查相应的属性(“可见”?)来选择适当的列/行。另一方面,您与 Excel 进行通信的方式当然并不理想。主要是在涉及这么多记录时。除非在非常特定的条件下(并且数据大小要小得多),否则依赖剪贴板不应该是一种选择。为什么不在列/行循环时直接写入 Excel? -
此外,如果您使用
DataSource来填充DataGridView,您可能更愿意直接依赖它,因为关联的对象(DataTable)比DataGridView更具适应性.