我有一个完整填充的DataTable,想要将其设置为DatagridView:
gdv.DataSource = dt;
然而,这个过程非常缓慢。DataTable 的填充非常快,但是仅仅上面那一行代码就需要很长时间。有没有办法可以加速或在另一个线程中执行呢?
在此之后没有任何交互。只有上面的简单语句!
谢谢。
我有一个完整填充的DataTable,想要将其设置为DatagridView:
gdv.DataSource = dt;
请检查格式选项,特别是与填充
相关的属性,包括AutoSizeColumnMode和单独的列样式。
对于所有行调整列宽需要进行大量计算。
这里有一个解决方案。问题在于框架在新数据源的每一行中重新调整列的大小(为什么?)。当然,每次它需要遍历所有行,导致一个O(n^2)的操作。所以,很遗憾,看起来您必须在设置数据源之前关闭自动调整大小,然后手动调用AutoResizeColumns方法。
grdChanges.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
grdChanges.DataSource = schemaChangesSpreadsheet.Changes
grdChanges.AutoResizeColumns(DataGridViewAutoSizeColumnMode.AllCells)
原来微软在一篇名为“最佳实践:扩展 Windows 窗体 DataGridView 控件”的文章中告诉你要这样做,如果您的 UI 设置存在相同的重计算问题,则此文章可能会对您有所帮助。
dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dtgvPlanificado.ColumnHeadersVisible = false;
dtgvPlanificado.DataSource = DS.Tables("LV1");
dtgvPlanificado.ColumnHeadersVisible = true;
dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
RowHeadersWidthSizeMode
从以下方式更改为:DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
to:
DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
非常有帮助。
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秒降至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