2009-12-30 159 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