2

我是 C# 和 .NET 的初学者,我遇到以下问题(使用 .NET 4.5):

我有三个 DataGridViews 应该显示来自 xml 文件的数据。每个 DataGrid 都应过滤其结果,因此它们的 xml 条目分布在三个 DataGridView 上。

我尝试了以下方法:

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 文件时,是否以正确的方式过滤相同的数据集?

4

3 回答 3

4

采取三个视图,因为我认为所有三个过滤器都应用于视图,并且您会得到显示最后一个过滤器结果的输出。你可以稍后改进它,如果它有效

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;
于 2012-04-17T10:47:47.813 回答
2

DataView 可能有一个由过滤器修改的公开可读的集合。当您设置数据源时,以这种方式提供 view1 将提供 DataView 的引用,而不是副本。这意味着所有过滤器都在修改同一个 DataView 实例中的同一个可查看集合(这可以解释为什么最后一个过滤器是正在工作的过滤器)。

我建议为每个过滤案例创建单独的 DataView 实例/副本。但是,这将保留在您的范围内,因为它们仍将引用从您的 xml 文件加载的相同数据。

于 2012-04-17T10:48:39.800 回答
1

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());
于 2012-04-17T10:49:38.007 回答