2

我在理解 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;

在这一点上,我认为创建的 BindingSource 是完全独立的。但实际上并非如此。更改Filter属性后bs1

`bs1.Filter = "id >= 2";`

Filter的属性bs2不变,但RowFilter两个 BindingSource 对象的基础 DataView的属性(List的属性BindingSource)发生了变化。

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

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

编辑:我找到了“为什么他们共享同一个列表?”的解释。- 似乎 List 是从DataTableDefaultView属性分配的(所以bs1.List == bs2.List,bs1.List == dt.DefaultView都是真的)。

4

3 回答 3

7

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

BindingSource bs1 = new BindingSource();
BindingSource bs2 = new BindingSource();
bs1.DataSource = new DataView(dt);
bs2.DataSource = new DataView(dt);
于 2012-07-01T09:05:50.617 回答
0

我还不是 C# 方面的专家,但根据我所读到的内容,我理解这一点:

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

您需要创建两个实例,并将每个 BindingSource 实例设置为引用其自己的 DataTable 实例,如下所示:

DataTable dt1 = new DataTable();

DataTable dt2 = new DataTable();

bs1.DataSource = dt1;

bs2.DataSource = dt2;

于 2012-07-01T09:02:36.400 回答
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.
于 2017-08-31T06:45:18.620 回答