我尝试将List<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 :(得分: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>
)移除应该在两个方向上操作的内容。