2012-12-21 79 views
3

我有一個C#WinForms應用程序,它包含可被填充有widget對象像這樣的的BindingList:清除BindingList並添加新項目很慢?

BindingList<Widget> widgetsList = new BindingList<Widget>(); 

甲插件有三個屬性(一個INT,一個串和一個布爾)和實現INotifyPropertyChanged。這些小部件被添加到的BindingList是這樣的:

for (int i = 0; i < 100000; i++) // takes < 1/10 of a second to execute 
{ 
    widgetsList.Add(new Widget(intValue, stringValue, boolValue)); 
} 

最後,我設置的BindingList作爲一個DataGridView的數據源(實際上有三個DataGridView的控制):

dataGridView1.DataSource = widgetsList; 

此代碼工作良好。但是,如果我的用戶在DataGridView中進行了更改,然後想要放棄這些更改並重新加載原始數據,那麼我遇到了問題。現在我有一個按鈕,要做到這一點,並在按鈕的Click事件處理程序的代碼看起來是這樣的:

dataGridView1.Rows.Clear() // very fast 

widgetsList.Clear() // also very fast 

    for (int i = 0; i < 100000; i++) // takes 18.6 seconds to execute 
    { 
     widgetsList.Add(new Widget(intValue, stringValue, boolValue)); 
    } 

正如你可以看到,這個循環將執行比同慢得多(18.6s VS <在.1)循環上面。它似乎工作,但我試圖找出瓶頸在哪裏,以及如何刪除它。我錯過了什麼嗎?

+1

而不是簡單地清除widgetsList,如果你真的創建一個新的實例呢?我已經看到其他對象保留內部緩衝區,即使清除後,也許這將清除它。另一個想法是刪除網格上的數據源,或者至少暫停綁定。它可能試圖在每次添加之後進行渲染,第一個循環不會在被設置爲數據源之前發生。 –

+0

你是對的!這是約束力。我不得不在BindingList和DataGridView之間添加一個綁定源,以便讓它工作,但這讓我在重新加載原始數據時暫停綁定,並解決了我的問題。如果您想以此作爲答案,我很樂意接受它。謝謝! – user685869

回答

4

發佈上述評論的答案:您需要在網格和綁定列表之間添加BindingSource。這將允許您在重新加載源列表時暫停綁定,並允許網格延遲渲染,直到數據源完全更新。

相關問題