在C#中将DataGridView的数据源设置为DataTable较慢

4

我有一个完整填充的DataTable,想要将其设置为DatagridView:

gdv.DataSource = dt;

然而,这个过程非常缓慢。DataTable 的填充非常快,但是仅仅上面那一行代码就需要很长时间。有没有办法可以加速或在另一个线程中执行呢?
在此之后没有任何交互。只有上面的简单语句!
谢谢。

当您使用相同的代码行,但仅使用10条记录的dt时会发生什么情况 - 快还是慢? - O.O
1
数据表中有多少条记录,值的大小是多少(是否有大型文本字段)? - RQDQ
非常快速,使用非常小的表格(10x10),在原始表格中最多有400行,可能有100列(最大值)。最长的字符串字段约为10个字符。 - Mark
6个回答

10

请检查格式选项,特别是与填充相关的属性,包括AutoSizeColumnMode和单独的列样式。

对于所有行调整列宽需要进行大量计算。


你所说的“Fill related”具体是什么意思?我在任何地方都没有看到过。有特别的吗? - Mark
自动调整列模式,以及单独的列样式。 - H H
自动调整列模式确实大大加快了它的速度!谢谢。 - Mark

5

这里有一个解决方案。问题在于框架在新数据源的每一行中重新调整列的大小(为什么?)。当然,每次它需要遍历所有行,导致一个O(n^2)的操作。所以,很遗憾,看起来您必须在设置数据源之前关闭自动调整大小,然后手动调用AutoResizeColumns方法。

grdChanges.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
grdChanges.DataSource = schemaChangesSpreadsheet.Changes
grdChanges.AutoResizeColumns(DataGridViewAutoSizeColumnMode.AllCells)

原来微软在一篇名为“最佳实践:扩展 Windows 窗体 DataGridView 控件”的文章中告诉你要这样做,如果您的 UI 设置存在相同的重计算问题,则此文章可能会对您有所帮助。

http://msdn.microsoft.com/zh-cn/library/ha5xt0d9.aspx


谢谢你的建议 :) - Mark

1
使用这段代码,我得到了不错的结果:
dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dtgvPlanificado.ColumnHeadersVisible = false;
dtgvPlanificado.DataSource = DS.Tables("LV1");  
dtgvPlanificado.ColumnHeadersVisible = true;  
dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

这非常好:当您首先将ColumnHeadersVisible设置为false,然后再设置为true时,时间从3.577毫秒变为98毫秒。 - Luca Ziegler

0
对我来说,将RowHeadersWidthSizeMode从以下方式更改为:
DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;

to:

DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;

非常有帮助。


0

AutoSizeColumnsMode 是真正的瓶颈...11 秒变成了 15 毫秒。

这就是我一直在寻找的东西:

<System.Runtime.CompilerServices.Extension()>
Public Sub BeginLoadData(dataGridView As DataGridView)
    dataGridView.Tag = dataGridView.AutoSizeColumnsMode
    dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
End Sub

<System.Runtime.CompilerServices.Extension()>
Public Sub EndLoadData(dataGridView As DataGridView)
    dataGridView.AutoSizeColumnsMode = CType(dataGridView.Tag, DataGridViewAutoSizeColumnsMode)
End Sub

1
问题是关于C#的。 - Luca Ziegler

0

不要忘记自动调整行高也可以发挥作用。这对我很有效。将数据绑定从约1秒降至0.1秒。但愿所有事情都能这么容易地获得10倍的速度提升!

dgvProperties.DataSource = Nothing
dgvProperties.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
dgvProperties.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
dgvProperties.DataSource = datatable
dgvProperties.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
dgvProperties.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接