2010-12-17 85 views
4

我使用dataGridView創建了一個Windows Forms。我還有一個長時間運行的SQL查詢,我正在運行一個BackgroundWorker線程來填充靜態數據表。用C#Windows窗體中的SQL查詢結果填充dataGridView

private void RunQuery_DoWork(object sender, DoWorkEventArgs e) 
{ 
    OdbcDataAdapter adapter = new OdbcDataAdapter(longRunningSQLQuery, datasourcename); 
    adapter.Fill(results); 
} 

private void RunQuery_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    dataGridView1.DataSource = results; 
} 

這工作得很好。當我去運行查詢時,由於結果在後臺生成,UI保持響應...但是,當需要在我的dataGridView中顯示結果時,如果窗口是一大組數據,窗口會凍結。如果我讓它坐下一段時間,最終它會結束。在我的RunWorkerCompleted回調函數中,我打電話 dataGridView1.DataSource = results;(結果是我的DataSet),這是需要很長時間的部分。

有沒有什麼辦法可以預先綁定dataGridView,或綁定它在backgroundworker?

回答

1

它將使用反射拉值出的數據源的。更快的方法可能是自己構建和添加行。您可能能夠在後臺線程中構建行列表,然後在主UI線程上添加它們作爲範圍 - 不確定。

顯然這樣做會損失數據綁定的好處,但是如果您想要加載大量數據, 這可能是唯一選項 。事實證明,你可以使用VirtualMode,你自己實現零件,但保持數據綁定的好處。

0

由於GridView是一個可視化組件,我認爲這個規則適用,只能在創建這些控件的前臺線程中調用方法和屬性。

也許你可以逐步填充網格,添加每個網格。每次迭代100條記錄,使控制響應更平穩。

Microsoft SQL Server Management Studio似乎也使用了一個GridView,處理大行很好。