2011-01-11 61 views
1

我有一個DataTable,完全填充,這是我想設置一個DataGridView:慢設置DataGridView的數據源到數據表在C#中

gdv.DataSource = dt; 

然而,這是痛苦的緩慢。 DataTable的填充非常快,但上面的這一行很長時間。有什麼方法可以加速或在另一個線程中執行它?

此後沒有交互作用。只是上面的簡單陳述!

謝謝。

+0

當您使用相同的代碼行,但只有10條記錄的dt時會發生什麼 - 快或慢? – 2011-01-11 17:20:33

+1

數據表中有多少條記錄,數值有多大(是否有任何大的文本字段?) – RQDQ 2011-01-11 17:20:35

+0

非常快,非常小的表(10x10),在原始表中最多有400行,也許100列(最大)。最長的字符串字段約爲10個字符。 – Mark 2011-01-11 17:34:34

回答

6

檢查格式選項,尤其是Fill相關屬性。調整所有行的列寬需要進行大量計算。

+0

填充相關的意思是什麼?我無法在任何地方看到。任何特別的? – Mark 2011-01-11 17:38:09

+0

autosizecolumnmode和單個列樣式 – 2011-01-11 17:46:04

5

這是一個修復。問題在於框架在新數據源中每行重新調整一次列的大小(爲什麼?)。當然,它每次都需要遍歷所有行,導致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

1

有了這個代碼,我有很好的效果:

dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None 
dtgvPlanificado.ColumnHeadersVisible = False 
dtgvPlanificado.DataSource = DS.Tables("LV1") 
dtgvPlanificado.ColumnHeadersVisible = True 
dtgvPlanificado.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells 
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 
0

爲我改變RowHeadersWidthSizeMode來自:

DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; 

到:

DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders; 

是非常有益的。