2017-04-03 63 views
2

当使用dataView.RowFilter时,我总是得到包含数据集最后一个元素的过滤结果。DataView rowfilter总是包含集合的最后一个

我有一个测试数据集:

private TestClass[] items = 
{ 
    new TestClass{name = "Hans", age = 10 }, 
    new TestClass{name = "Bert", age = 5 }, 
    new TestClass{name = "Gerda", age = 41 }, 
    new TestClass{name = "Dolf", age = 73 }, 
    new TestClass{name = "Ludo", age = 35 }, 
}; 

创建数据视图:

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add("Name", typeof(string)); 
dataTable.Columns.Add("Age", typeof(int)); 
dataTable.Columns.Add("TestItem", typeof(TestClass)); 
DataView dataView = new DataView(dataTable); 

foreach(var item in items) 
{ 
    dataView.AddNew(item.name, item.age, item); 
} 

设置过滤器和数据源:

dataView.RowFilter = "[Name] = 'Hans'"; 
comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "TestItem"; 
comboBox1.DataSource = dataView; 

这应该只返回汉斯的结果,但对于我给出了结果: Hans和Ludo。

如果我对'Ludo'进行筛选,结果只会导致'Ludo'。 为什么它总是返回最后一个元素,我如何确保它只返回过滤后的集合?

-edit

public static class DataViewExtensions 
{ 
    public static DataRowView AddNew(this DataView dataView, params object[] parameters) 
    { 
     DataRowView dataRowView = dataView.AddNew(); 

     int index = 0; 
     foreach (var parameter in parameters) 
     { 
      dataRowView[index++] = parameter; 
     } 

     return dataRowView; 
    } 
} 
+0

我测试你的代码,我没有为'DatView.AddNew(ARG1,ARG2,ARG3)',只是[DatView.AddNew()](https://msdn.microsoft过载.COM/EN-US /库/ system.data.dataview.addnew(v = vs.110)的.aspx)。你是否在不同的命名空间中重写了这个方法? – djv

+0

当填充数据表而不是dataView,然后从填充的DataTable创建数据视图时,它可以工作。 – Chevalric

+0

@djv是的,我很抱歉,这是一个函数,我用它不必自己分配每列。相反,我做了一个扩展,循环参数分配值。 – Chevalric

回答

0

有一个例外,这人似乎得到

数据表之前,必须先设置为使用数据视图

(我建议你把在搜索引擎)

虽然你没有得到异常,y你应该遵循这个顺序。

幸运的是,在DataView之前设置DataTable可以用较少的代码完成,并且没有扩展方法。

TestClass[] items = 
{ 
    new TestClass{name = "Hans", age = 10 }, 
    new TestClass{name = "Bert", age = 5 }, 
    new TestClass{name = "Gerda", age = 41 }, 
    new TestClass{name = "Dolf", age = 73 }, 
    new TestClass{name = "Ludo", age = 35 }, 
}; 

DataTable dataTable = new DataTable(); 
dataTable.Columns.Add("Name", typeof(string)); 
dataTable.Columns.Add("Age", typeof(int)); 
dataTable.Columns.Add("TestItem", typeof(TestClass)); 

// set up the DataTable first 
foreach (var item in items) 
{ 
    dataTable.Rows.Add(item.name, item.age, item); 
} 

// then use the DataView 
DataView dataView = new DataView(dataTable); 

dataView.RowFilter = "[Name] = 'Hans'"; 

comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "TestItem"; 
comboBox1.DataSource = dataView; 
+0

感谢您的明确解释和研究。这清除了一切。 – Chevalric

相关问题