簡體   English   中英

在 C# 中將 DataGridView DataSource 設置為 DataTable 很慢

[英]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 設置,它可能會幫助你,如果你有同樣的繁重計算問題。

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

使用此代碼,我得到了很好的結果:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM