我在理解BindingSource的行为方面遇到了一些困难。 我们来看下面的例子:
创建表
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 });
创建两个具有相同DataSource属性的BindingSource对象
BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
bs1.DataSource = dt;
bs2.DataSource = dt;
此时我认为,创建的BindingSource是完全独立的。但事实并非如此。 更改Filter
的bs1
属性后:
`bs1.Filter = "id >= 2";`
Filter
bs2
的{{1}}属性不会更改,但基础DataView的RowFilter
属性(List
BindingSource
属性)两个BindingSource对象都被更改。
事实证明,两个BindingSource
对象都具有完全相同的DataView实例,即条件bs1.List == bs2.List
为true
。
我的问题是为什么他们共享相同的List以及如何改变这种行为?
编辑:
我找到了解释“为什么他们共享相同的列表?” - 似乎列表是从DataTable
的{{1}}属性中分配的(因此DefaultView
,bs1.List == bs2.List
都是真的。)
答案 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.