2011-11-05 120 views
10

我從一個數據表填充datagridview。c#很慢填充datagridview

填充列和行時,我也同時格式化它,這會導致datagridview加載非常緩慢,是否有解決此問題的方法?

+0

你有格式的代碼示例。您將多少數據加載到網格中?你使用分頁數據源還是加載網格? – Ivo

+0

你可以發佈你用來填充DatagridView的代碼嗎?你是否用datatable綁定了datagridView,或者你是否遍歷數據表並在DatagridView中插入記錄? – aleroot

回答

3

當您使用datagrid視圖來顯示dataabse中的數據時,您應該始終考慮使用某種策略來限制結果集並僅在用戶真正看到它們時才顯示記錄。這被稱爲某種虛擬模式或數據分頁。我得到了一個example of this strategy for wpf,但也有一些winforms。看看這個問題:Winform DataGridview incredibly slow compared to MS Access Grid我認爲你的問題也是如此。

+0

同意的是,當有人談到數據網格的緩慢時,通常關於數千行正在被讀取以顯示10行。確保你正在閱讀分頁數據。 (又名:數據分頁) – detay

+1

@detay是有一個快速網格的魔力不是你填充它的速度有多快,但要避免填充它:D –

4

您可以檢查DataGridView的屬性 - AutoSizeColumnsMode 我發現如果將模式從AllCells更改爲DisplayedCell,則性能會有所不同。 我希望這會幫助你。

10

除了照顧AutoSizeColumnsMode之外,請確保各個列的AutoSizeMode屬性也設置爲除所有單元格之外的其他值。

我還發現有必要使用

SendMessage(dg.Handle, WM_SETREDRAW, false, 0); // before 

// updates to datagridview here... 

SendMessage(dg.Handle, WM_SETREDRAW, true, 0); // after 
+1

在刷新數據源之前將AutoSizeColumnsMode更改爲None,然後將其設置爲All數據源被設置爲將我的加載時間從幾分鐘減少到不到一秒。 – KevenDenen

6

我需要大約2-4分鐘來加載1-2K行。我改變了自動調整大小的屬性,現在降到秒,大約10-20。我在我的行創建循環之前運行這個權利,以確保它獲得所有的列。

foreach (DataGridViewColumn c in thisGrid.Columns) 
{ 
    c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; 
} 
2

一個破章的規則: - 避免數據表,衆所周知的是inefficicient - 避免使用行的預分配[ 「網格」 .Rowcount + 「網格」 .AddRange()+ .. ](比「Grid」ADD()慢〜5倍) - 考慮DataGridView綁定到「你的屏幕」:即。用一些數據屏幕加載它。 - 我應用了這些簡單的事實,我可以在15秒內「加載」一個42萬行的「愚蠢文件」,並有159列。 (〜200 MB)。

0

我有一個相當不錯的表現DataGridView。添加幾百行需要大約200ms。這是我做的:

virtual = true - 使用虛擬化數據網格視圖似乎使整個過程更快。請記得正確實施logViewGrid_CellValueNeeded

另一件要做的事情是在向綁定列表添加數據時臨時禁用佈局事件。試着這樣做:

logViewGrid.SuspendLayout(); 
// add data, perform some operations on grid view 
logViewGrid.ResumeLayout(false); 

我也有一個問題,慢行着色;我做這件事的方法是分別設置每個細胞的風格,就像這樣:

gridViewInstance.Rows[currentRow].Cells[cellIndex].Style.BackColor = val; 

相反,我去:

gridViewInstance.Rows[currentRow].DefaultCellStyle.BackColor = val; 

其中,30列,給了我顯著的速度增加,這部分的代碼。

0

我在一個程序中做了一些測試,其中我加載了5000行6列,每個單元格加載行號只是爲了獲得一些數據。然後,我使用秒錶來測試每種方法。我加載了dataviewgrid,將其禁用並加載,然後啓用它,隱藏它,加載它並顯示它,以及suspendlayout和resumelayout。我發現通過隱藏它並加載它,然後在測試中顯示它快得多。它花了: .91秒,只是加載 .91秒暫停佈局,加載,resumeLayout .25秒禁用,加載和重新啓用電網 .19秒來隱藏,加載,並顯示網格。

我同意你應該避免加載你不需要的東西,但認爲這個測試會有幫助。

6

有了這將是datagridview的快如Java JTable中:)

public static class ExtensionMethods 
{ 
    public static void DoubleBuffered(this DataGridView dgv, bool setting) 
    { 
     Type dgvType = dgv.GetType(); 
     PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", 
      BindingFlags.Instance | BindingFlags.NonPublic); 
     pi.SetValue(dgv, setting, null); 
    } 
} 

ExtensionMethods.DoubleBuffered(dataGridView1, true);