我试图绑定List<T>
到DataGridView
.在实现删除行之前,一切似乎都没问题:
Companies.CompaniesList.RemoveAt(dataGridView1.SelectedRows[0].Index);
dataGridView1.DataSource = Companies.CompaniesList;
Run Code Online (Sandbox Code Playgroud)
(Companies.Companies是List<Company>
收藏)我得到的是数据错误消息(虽然行已成功删除).我试过这个:
Companies.CompaniesList.RemoveAt(dataGridView1.SelectedRows[0].Index);
bs = new BindingSource();
bs.DataSource = Companies.CompaniesList;
dataGridView1.DataSource = bs;
Run Code Online (Sandbox Code Playgroud)
它按预期工作.问题是:为什么?
属性更改(via set
)通常用于检测和忽略不执行任何操作的更改,因此在行中:
dataGridView1.DataSource = Companies.CompaniesList;
Run Code Online (Sandbox Code Playgroud)
我希望已经DataSource
是这样,所以什么都没发生.除了测试引用外,没有执行任何代码.检查反射器确认这(): Companies.CompaniesList
DataGridView.DataSource
set
{
if (value != this.DataSource)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
因此它只在更新引用时执行任何操作.
另外,由于List<T>
没有实现必要的绑定接口,因此网格不知道列表内容已被更改,因此错误.对比:
bs = new BindingSource();
bs.DataSource = Companies.CompaniesList;
dataGridView1.DataSource = bs;
Run Code Online (Sandbox Code Playgroud)
在这里,DataSource
已经改变了,这bs
是一个全新的对象.这会导致整个网格重新绑定.
另一种选择是使用BindingList<T>
或从两个方向上操作的BindingSource
(而不是List<T>
)中移除.