两个具有相同DataSource属性的BindingSource对象

时间:2012-07-01 08:50:39

标签: c# winforms data-binding dataview

我在理解BindingSource的行为方面遇到了一些困难。 我们来看下面的例子:

  1. 创建表

    DataTable dt = new DataTable();

    dt.Columns.Add("id", typeof(int));

    dt.Rows.Add(new object[] { 0 });

    dt.Rows.Add(new object[] { 1 });

    dt.Rows.Add(new object[] { 2 });

    dt.Rows.Add(new object[] { 3 });

  2. 创建两个具有相同DataSource属性的BindingSource对象

    BindingSource bs1 = new BindingSource();

    BindingSource bs2 = new BindingSource();

    bs1.DataSource = dt;

    bs2.DataSource = dt;

  3. 此时我认为,创建的BindingSource是完全独立的。但事实并非如此。 更改Filter bs1属性后:

    `bs1.Filter = "id >= 2";`
    
    Filter bs2的{​​{1}}属性不会更改,但基础DataView的RowFilter属性(List BindingSource属性)两个BindingSource对象都被更改

    事实证明,两个BindingSource对象都具有完全相同的DataView实例,即条件bs1.List == bs2.Listtrue

    我的问题是为什么他们共享相同的List以及如何改变这种行为?

    编辑: 我找到了解释“为什么他们共享相同的列表?” - 似乎列表是从DataTable的{​​{1}}属性中分配的(因此DefaultViewbs1.List == bs2.List都是真的。)

3 个答案:

答案 0 :(得分:7)

似乎要更改此行为,可以为DataView创建两个不同的DataTable实例,并相应地将它们分配给两个DataSource对象的BindingSource属性:

BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
bs1.DataSource = new DataView(dt);
bs2.DataSource = new DataView(dt);

答案 1 :(得分:0)

我还不是C#的专家,但从我读过的内容我明白了这一点:

通过使用DataTable dt = new DataTable();,您只创建该对象的一个​​实例。如果该实例发生更改,则会更改引用它的任何内容。

你需要创建两个实例,并设置BindingSource的每个实例来引用它自己的DataTable实例,如下所示:

DataTable dt1 = new DataTable();

DataTable dt2 = new DataTable();

bs1.DataSource = dt1;

bs2.DataSource = dt2;

答案 2 :(得分:0)

鲁本的回答对我不起作用,但指出了正确的方向。 我不得不在绑定源中设置过滤器以使其工作。 以下是适合我的代码

BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
bs2.Filter = "My Filter"; // Instead of setting filter on DataView, I had to set it on binding source.
bs1.DataSource = new DataView(dt);
bs2.DataSource = new DataView(dt);
//bs2.DataSource = new DataView(dt, RowFilter: "My Filter", Sort: "", RowState: DataViewRowState.CurrentRows); // This does not work.