【问题标题】:How can I use the same DataSource for multiple DataGridViews with a different filter applied on each?如何为多个 DataGridView 使用相同的 DataSource,并在每个 DataGridView 上应用不同的过滤器?
【发布时间】:2012-04-28 16:45:21
【问题描述】:

我是 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 都使用最后一个过滤器 ('blue)'。

XML 看起来像这样(简化):

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

当我想将更改写回 xml 文件时,是否只是以正确的方式过滤相同的数据集?

【问题讨论】:

    标签: c# .net data-binding datagridview filter


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 啊,好的,感谢您澄清这一点。我不知道 view1 只是参考而不是副本。
      • 在处理类变量时,您总是在处理引用,即使作为参数传递也是如此(与复制自身的原始类型不同)。如果您希望使用类实例的多个副本,则必须显式复制它;使用您自己的方法或使用 .NET 框架中提供的方法。但是,在某些情况下为您完成了复制,例如当您使用数组或另一个集合实例化集合时;集合构造函数使用您提供的引用为您执行复制。
      【解决方案3】:

      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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多