簡體   English   中英

如何對多個DataGridView使用相同的DataSource,並對每個DataGridView應用不同的過濾器?

[英]How can I use the same DataSource for multiple DataGridViews with a different filter applied on each?

我是C#和.NET的初學者,遇到以下問題(使用.NET 4.5):

我有三個DataGridViews,它們應該顯示xml文件中的數據。 每個DataGrid應該過濾其結果,因此它們的xml條目分布在三個DataGridViews中。

我嘗試了以下方法:

DataSet dataSet1 = new DataSet();
dataSet1.ReadXml('some-existing-file.xml');

DataTableCollection tables = dataSet1.Tables;
DataView view1 = new DataView(tables[0]);

BindingSource source1 = new BindingSource();
source1.DataSource = view1;
source1.Filter = "color = 'red'";
gridView1.DataSource = source1;

BindingSource source2 = new BindingSource();
source2.DataSource = view1;
source2.Filter = "color = 'white'";
gridView2.DataSource = source2;

BindingSource source3 = new BindingSource();
source3.DataSource = view1;
source3.Filter = "color = 'blue'";
gridView3.DataSource = source3;

但這不起作用。 所有三個GridView使用最后一個過濾器(“藍色”)。

XML看起來像這樣(簡化):

<?xml version="1.0" encoding="utf-8"?>
<collection>
    <entry>
        <color>blue</color>
        <headline>Some headline</headline>
    </entry>
    [...]
</collection>

當我想將更改寫回到xml文件時,只是過濾正確的數據集是正確的方法嗎?

以三個視圖為例,因為我認為所有三個過濾器都應用於視圖,您將獲得顯示最后一個過濾器結果的輸出。 如果可行,您以后可以對其進行改進

DataView view1 = new DataView(tables[0]);
DataView view2 = new DataView(tables[0]);
DataView view3 = new DataView(tables[0]);


BindingSource source1 = new BindingSource();
source1.DataSource = view1;
source1.Filter = "color = 'red'";
gridView1.DataSource = source1;

BindingSource source2 = new BindingSource();
source2.DataSource = view2;
source2.Filter = "color = 'white'";
gridView2.DataSource = source2;

BindingSource source3 = new BindingSource();
source3.DataSource = view3;
source3.Filter = "color = 'blue'";
gridView3.DataSource = source3;

DataView可能有一個公開可讀的集合,該集合會被過濾器修改。 設置數據源時,以這種方式提供view1將提供DataView的引用,而不是副本。 這意味着所有過濾器都在同一DataView實例中修改相同的可見集合(這將解釋為什么最后一個過濾器是起作用的過濾器)。

我建議為每個過濾案例創建單獨的DataView實例/副本。 但是,這仍然在您的范圍內,因為它們仍將引用從xml文件加載的相同數據。

DataView view1 = new DataView(tables[0]); 應該進行如下更改以為每個gridview准備新的DataView obj。

DataView view1 = new DataView(tables[0].Copy());
DataView view2 = new DataView(tables[0].Copy());
DataView view3 = new DataView(tables[0].Copy());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM