17

我正在尝试使用 BindingList 作为数据源来过滤 BindingSource。我试过 BindingSource.Filter = 'Text Condition' 但它没有用,没有任何反应,屏幕上的数据保持不变。但是,如果我使用 DataSet 作为数据源,它就可以工作。是否可以使用 BindingSource.Filter 属性过滤对象列表?

我有以下课程:

class Person
        {
            public String Nombre { get; set; }
            public String Apellido { get; set; }
            public int DNI { get; set; }
            public int Edad { get; set; }
            public Decimal Tamano { get; set; }
        }

这就是我使用它的方式:

BindingList<Person> personas = new BindingList<Person> { 
                new Person{ Apellido = "App1", DNI = 3011, Edad = 20, Nombre ="Name1", Tamano = new decimal(1.7)}
                ,new Person{ Apellido = "App2", DNI = 1520, Edad = 30, Nombre ="Name2", Tamano = new decimal(1.5)}
                ,new Person{ Apellido = "App3", DNI = 5654, Edad = 21, Nombre ="Name3", Tamano = new decimal(1.6)}
                ,new Person{ Apellido = "App4", DNI = 778, Edad = 40, Nombre ="Name4", Tamano = new decimal(1.68)}
            };

            BindingSource bs = new BindingSource();
            bs.DataSource = personas;
            grid.DataSource = bs;

            bs.Filter = "Apellido like 'App1'";

这只是一个例子,这个想法是为了测试是否可以过滤这样的数据源。我将在一个新项目中使用这些知识。

pd:我们的想法是尽可能使用 BindingSource.Filter。

4

3 回答 3

9

根据http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.filter.aspx

只有实现IBindingListView接口的底层列表支持过滤。

BindingList<T>似乎没有实现IBindingListView- 因为它是基础列表,所以您的集合不会过滤。

BindingSource类虽然不是通用类,但确实实现了此接口,因此请尝试将其用作您的角色集合。我觉得简单地将新的 BindingSource 的数据源分配给 BindingList 是不够的,因为它不会更改基础列表。尝试:

BindingSource personas = new BindingSource { new Person{ ... }, ... };
于 2012-04-09T13:45:07.647 回答
3

作为实现 IBindingListView 的替代方案,您可以尝试这种类型的过滤:

BindingList<Person> personas = new BindingList<Person> {  
new Person{ Apellido = "App1", DNI = 3011, Edad = 20, Nombre ="Name1", Tamano = new decimal(1.7)} 
,new Person{ Apellido = "App2", DNI = 1520, Edad = 30, Nombre ="Name2", Tamano = new decimal(1.5)} 
,new Person{ Apellido = "App3", DNI = 5654, Edad = 21, Nombre ="Name3", Tamano = new decimal(1.6)} 
,new Person{ Apellido = "App4", DNI = 778, Edad = 40, Nombre ="Name4", Tamano = new decimal(1.68)} 
};

BindingList<Person> filtered = new BindingList<Person>(personas.Where(
                                 p => p.Apellido.Contains("App1")).ToList());
grid.DataSource = filtered;
于 2012-04-09T13:58:45.143 回答
1

我认为这是因为 BindingSource 不知道它正在过滤什么类型的数据。将数据转换为数据集并转换为列和行后,即可运行过滤器。因为你的数据源是一个类,它不能做自动过滤。

于 2012-04-09T13:40:50.293 回答