在C#中将DataGridView DataSource设置为DataTable的速度很慢

时间:2011-01-11 17:17:21

标签: c# winforms datagridview datatable backgroundworker

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

gdv.DataSource = dt;

然而,这非常缓慢。 DataTable的填充速度非常快,但上面这一行需要很长时间。有没有办法加快速度或在另一个线程中执行它?

此后没有互动。只是上面简单的陈述!

感谢。

6 个答案:

答案 0 :(得分:8)

检查格式选项,尤其是Fill相关属性。调整所有行的列宽需要大量计算。

答案 1 :(得分:5)

这是一个修复。问题是框​​架在新数据源中每行重新调整一次列的大小(为什么??)。当然,每次都需要遍历所有行,从而产生O(n ^ 2)运算。很遗憾看起来你必须在设置数据源之前关闭自动调整大小,然后手动调用AutoResizeColumns方法。

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

原来,Microsoft告诉您在文章“扩展Windows窗体DataGridView控件的最佳实践”中这样做,如果您有一个具有相同繁重计算问题的不同UI设置,这可能对您有所帮助。

http://msdn.microsoft.com/en-us/library/ha5xt0d9.aspx

答案 2 :(得分:1)

使用此代码我有很好的结果:

dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
dtgvPlanificado.ColumnHeadersVisible = False  
dtgvPlanificado.DataSource = DS.Tables("LV1")  
dtgvPlanificado.ColumnHeadersVisible = True  
dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

答案 3 :(得分: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

答案 4 :(得分:0)

我改变了RowHeadersWidthSizeMode

DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;

为:

DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;

非常有帮助。

答案 5 :(得分: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