2012-07-01 298 views
2

我對理解BindingSource的行爲有些困難。 讓我們來看看下面的例子:具有相同DataSource屬性的兩個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. 創建兩個BindingSource的具有相同的DataSource屬性對象

    BindingSource bs1 = new BindingSource();

    BindingSource bs2 = new BindingSource();

    bs1.DataSource = dt;

    bs2.DataSource = dt;

在這一點上,我認爲,創建的BindingSource是完全獨立的。但事實並非如此。 改變bs1Filter屬性後:的兩者的BindingSource對象底層數據視圖(的BindingSourceList屬性)的

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

Filterbs2屬性不發生變化,但RowFilter性質改變

事實證明,這兩種BindingSource對象具有數據視圖的完全相同實例即條件bs1.List == bs2.Listtrue

我的問題是爲什麼他們共享相同的列表,以及如何改變這種行爲?

編輯: 我找到了解釋爲什麼他們共享相同的列表? - 似乎列表分配從DataTableDefaultView財產(因此bs1.List == bs2.Listbs1.List == dt.DefaultView都是正確的)。

回答

7

看來要改變t他的行爲可以爲DataTable創建兩個不同DataView實例,並將它們分配給相應的2個BindingSource對象DataSource屬性:

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

我還沒有在C#中的專家,但是從我讀過我明白這一點:

通過使用您創建的對象只有一個實例DataTable dt = new DataTable();。如果該實例發生變化,它將會改變引用它的任何事物。

你需要創建兩個實例,並設置BindingSource的每個實例引用自己的DataTable的情況下,像這樣:

DataTable dt1 = new DataTable();

DataTable dt2 = new DataTable();

bs1.DataSource = dt1;

bs2.DataSource = dt2;

+0

不,我需要將它們指向相同的'DataTable'對象。現在我找到了答案。將很快發佈。謝謝。 – Ruben

+0

我期待着看到。 – impyre

+0

http://stackoverflow.com/a/11280789/1262928 – Ruben

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. 
相關問題