我试图绑定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.CompaniesListDataGridView.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>)中移除.
| 归档时间: |
|
| 查看次数: |
2327 次 |
| 最近记录: |