将List <T>绑定到DataGridView

Ser*_*gey 4 c# winforms

我试图绑定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)

它按预期工作.问题是:为什么?

Mar*_*ell 7

属性更改(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>)中移除.