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)循環上面。它似乎工作,但我試圖找出瓶頸在哪裏,以及如何刪除它。我錯過了什麼嗎?
而不是簡單地清除widgetsList,如果你真的創建一個新的實例呢?我已經看到其他對象保留內部緩衝區,即使清除後,也許這將清除它。另一個想法是刪除網格上的數據源,或者至少暫停綁定。它可能試圖在每次添加之後進行渲染,第一個循環不會在被設置爲數據源之前發生。 –
你是對的!這是約束力。我不得不在BindingList和DataGridView之間添加一個綁定源,以便讓它工作,但這讓我在重新加載原始數據時暫停綁定,並解決了我的問題。如果您想以此作爲答案,我很樂意接受它。謝謝! – user685869