2009-12-30 127 views
4

我試圖綁定List<T>DataGridView。一切似乎是確定之前,我實現了刪除行:綁定列表<T>到DataGridView

Companies.CompaniesList.RemoveAt(dataGridView1.SelectedRows[0].Index); 
dataGridView1.DataSource = Companies.CompaniesList; 

(Companies.Companies是List<Company>集合) 我所得到的是數據錯誤信息(雖然行已成功刪除)。我試過這個:

Companies.CompaniesList.RemoveAt(dataGridView1.SelectedRows[0].Index); 
bs = new BindingSource(); 
bs.DataSource = Companies.CompaniesList; 
dataGridView1.DataSource = bs; 

它按預期工作。問題是:爲什麼?

+0

你第一次嘗試得到什麼錯誤? – Krunal 2009-12-30 12:42:21

回答

7

它是(通過set)性質的變化來檢測和忽略什麼也不做改變常見,因此在線路:

dataGridView1.DataSource = Companies.CompaniesList; 

我期待DataSource已經Companies.CompaniesList,所以什麼發生。沒有執行代碼,除了測試引用。檢查反射器證實了這一點(DataGridView.DataSource):

set 
{ 
    if (value != this.DataSource) 
    { 
     ... 
    } 
} 

所以它只做什麼當參考被更新。

此外,由於List<T>沒有實現必要的綁定接口,網格不知道列表內容已被更改,因此錯誤。現在對比:

bs = new BindingSource(); 
bs.DataSource = Companies.CompaniesList; 
dataGridView1.DataSource = bs; 

這裏,DataSource已經改變,作爲bs是一個全新的對象。這會導致整個電網重新綁定。

另一個選擇是使用BindingList<T>,或從BindingSource(而不是List<T>)中刪除應該在兩個方向上運行。

+0

謝謝!這是一個很好的答案。 – Sergey 2009-12-30 13:12:50