[英]Slow to set DataGridView DataSource to DataTable in C#
我有一個完全填充的 DataTable,我想將其設置為 DatagridView:
gdv.DataSource = dt;
然而,這非常緩慢。 DataTable 的填充非常快,但只是上面的這一行需要很長時間。 有沒有辦法加快速度或在另一個線程中執行它?
在此之后沒有交互。 只是上面的簡單陳述!
謝謝。
檢查格式選項,尤其是與Fill
相關的屬性。 這些是 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;
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
對我來說,將RowHeadersWidthSizeMode
更改為:
DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
到:
DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
非常有幫助。
不要忘記自動調整行也可以發揮作用。 這對我很有效。 將數據綁定從 ~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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.