使用CollectionView筛选DataTable时出错的原因

本文关键字:出错 CollectionView 筛选 DataTable 使用 | 更新日期: 2023-09-27 18:25:16

按标题。

因此,我成功地使用将DataTable放入我的CollectionView

    ICollectionView _collectionView { get; set; }
    public ICollectionView collectionView {......}
            DataTable myDataTable= new DataTable();
            myConnection.Open();
            dbAdpater.Fill(myDataTable);
            myConnection.Close();
            var collectionList= (newLeadTable as IListSource).GetList();
            this.collectionView = CollectionViewSource.GetDefaultView(collectionList);

我知道列表中的每个对象都是DataRowView,当我通过迭代数据进行测试时,我可以看到它被正确地存储了。

当我执行代码时,DataGrid显示正确。

但一旦我添加了过滤器:

            this.collectionView.Filter = new Predicate<object>(
                (obj) =>
                {
                    return false; //Just for testing propose
                }
            );

当我执行代码时,会出现错误:

无法创建程序集"TestWPF"中定义的"Window1"的实例,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null'。异常具有被调用的目标抛出。标记文件中出错'测试WPF;component/Window1.xaml'行1位置9。

输出:

"System.NotSupportedException"类型的首次机会异常出现在PresentationFramework.dll 中

我还尝试存储并将DataTable转换为custom object的列表以进行筛选,但运行良好。

所以我想知道我用DataTable过滤时做错了什么?

使用CollectionView筛选DataTable时出错的原因

请参阅http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections

为了提高性能,ADO.NET DataTable或DataView对象的集合视图将排序和筛选委托给DataView。

BindingListCollectionView不支持筛选。相反,您必须使用CustomFilter属性,该属性接受一个筛选器字符串并将其用作基础DataView.RowFilter属性的值。字符串值是SQL,用于在SELECT查询中构造WHERE子句。

this.collectionView.CustomFilter = "Price > 20";

如果要使用多个条件,则必须使用AND或or(就像SQL一样)将它们串在一起。