将List <t>绑定到DataGridView </t>

时间:2009-12-30 12:35:40

标签: c# winforms

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

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

1 个答案:

答案 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>)移除应该在两个方向上操作的内容。