【问题标题】:Why errors when filters DataTable with CollectionView?使用 CollectionView 过滤 DataTable 时为什么会出错?
【发布时间】:2012-03-12 05:33:22
【问题描述】:

如标题。

所以我成功地将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”实例, 版本=1.0.0.0,文化=中性,PublicKeyToken=null'。异常有 被调用的目标抛出。标记文件中的错误 'TestWPF;component/Window1.xaml' 第 1 行位置 9。

然后输出:

“System.NotSupportedException”类型的第一次机会异常 发生在 PresentationFramework.dll 中

我还尝试存储将DataTable 转换为custom object 列表进行过滤,但工作正常。

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

【问题讨论】:

    标签: c# wpf datagrid filter


    【解决方案1】:

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

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

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

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

    如果你想使用多个条件,那么你必须用 AND 或 OR 将它们串在一起(就像 SQL 一样)。

    【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2021-07-26
    • 2021-03-04
    • 2010-10-18
    相关资源
    最近更新 更多