Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对多个DataGridView使用相同的数据源,并对每个DataGridView应用不同的筛选器?_C#_.net_Data Binding_Datagridview_Filter - Fatal编程技术网

C# 如何对多个DataGridView使用相同的数据源,并对每个DataGridView应用不同的筛选器?

C# 如何对多个DataGridView使用相同的数据源,并对每个DataGridView应用不同的筛选器?,c#,.net,data-binding,datagridview,filter,C#,.net,Data Binding,Datagridview,Filter,我是C#和.NET的初学者。我是否有以下问题(使用.NET 4.5): 我有三个DataGridView,它们应该显示xml文件中的数据。每个DataGrid都应该过滤它的结果,因此它们的xml条目分布在三个DataGridView上 我尝试了以下方法: DataSet dataSet1=新数据集(); dataSet1.ReadXml('some-existing-file.xml'); DataTableCollection tables=dataSet1.tables; DataView视

我是C#和.NET的初学者。我是否有以下问题(使用.NET 4.5):

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

我尝试了以下方法:

DataSet dataSet1=新数据集();
dataSet1.ReadXml('some-existing-file.xml');
DataTableCollection tables=dataSet1.tables;
DataView视图1=新的DataView(表[0]);
BindingSource1=新的BindingSource();
source1.DataSource=view1;
source1.Filter=“颜色=‘红色’”;
gridView1.DataSource=source1;
BindingSource2=新的BindingSource();
source2.DataSource=view1;
source2.Filter=“颜色=‘白色’”;
gridView2.DataSource=source2;
BindingSource3=新的BindingSource();
source3.DataSource=view1;
source3.Filter=“颜色=‘蓝色’”;
gridView3.DataSource=source3;
但这是行不通的。所有三个GridView都使用最后一个过滤器(“蓝色”)

XML如下所示(简化):


蓝色
一些标题
[...]

当我想将更改写回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(表[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());

啊,好的,谢谢你澄清这一点。我不知道view1只是一个引用而不是副本。在处理类变量时,您总是在处理引用,即使是作为参数传递时也是如此(与复制自身的基本类型不同)。如果您希望使用类实例的多个副本,则必须显式复制它;可以使用您自己的方法,也可以使用.NET framework中提供的方法。但是,在某些情况下,复制是为您完成的,例如使用数组或其他集合实例化集合;集合构造函数使用您提供的引用为您执行复制。