将List<T>绑定到DataGridView

4

我试图将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;

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


你第一次尝试时遇到了什么错误? - Krunal
1个回答

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>中删除),这应该可以双向操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接