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プロパティを使用して2つのBindingSourceオブジェクトを作成する

    BindingSource bs1 = new BindingSource();

    BindingSource bs2 = new BindingSource();

    bs1.DataSource = dt;

    bs2.DataSource = dt;

この時点で、作成されたBindingSourceは完全に独立していると思いました。しかし、実際にはそうではありません。のプロパティを変更した後Filterbs1

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

Filterのプロパティはbs2変更されませんが、RowFilter両方のBindingSourceオブジェクトの基になるDataViewのプロパティ(ListのプロパティBindingSource)が変更されます。

両方のBindingSourceオブジェクトがまったく同じDataViewのインスタンスを持っていることがわかります。つまり、条件bs1.List == bs2.Listtrueです。

私の質問は、なぜそれらが同じリストを共有するのか、そしてどのようにこの振る舞いを変えることができるのかということです。

編集:「なぜ彼らは同じリストを共有しているのですか?」の説明を見つけました。DataTable-ListDefaultViewはのプロパティから割り当てられているようです(したがってbs1.List == bs2.List、両方ともbs1.List == dt.DefaultViewtrueです)。

4

3 に答える 3

7

この動作を変更するには、2 つの異なるDataViewインスタンスを作成し、それに応じて 2 つのオブジェクトのプロパティにDataTable割り当てることができるようです。DataSourceBindingSource

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();すると、そのオブジェクトのインスタンスを 1 つだけ作成できます。そのインスタンスが変更されると、それを参照するすべてのものが変更されます。

2 つのインスタンスを作成し、BindingSource の各インスタンスを次のように DataTable の独自のインスタンスを参照するように設定する必要があります。

DataTable dt1 = new DataTable();

DataTable dt2 = new DataTable();

bs1.DataSource = dt1;

bs2.DataSource = dt2;

于 2012-07-01T09:02:36.400 に答える