Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DataGridView Filter a BindingSource with a List of object as DataSource

Tags:

c#

winforms

I'm trying to filter a BindingSource with a BindingList as Datasource. I tried BindingSource.Filter = 'Text Condition' But it didn't work, nothing happens, the data on screen remains the same. But if i use a DataSet as the datasource it works. Is It possible to filter a list of objects with the BindingSource.Filter property?

I have the following class:

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; }
        }

This is how i use it:

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'";

This is just an example the idea is to test if a can filter a data source like that. I will use the knowledge inside a new project.

pd: The idea is to be able to use BindingSource.Filter if it is possible.

like image 509
Müsli Avatar asked Apr 09 '12 13:04

Müsli


3 Answers

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

Only underlying lists that implement the IBindingListView interface support filtering.

BindingList<T> does not appear to implement IBindingListView - and since it is the underlying list, your collection will not filter.

BindingSource class, while not generic, does implement this Interface, so try using this as your personas collection. I get the feeling that simply assigning a new BindingSource's datasource to a BindingList won't suffice, since it doesn't change the underlying list. Try:

BindingSource personas = new BindingSource { new Person{ ... }, ... };
like image 119
Alain Avatar answered Oct 18 '22 16:10

Alain


As an alternative to implementing IBindingListView which can be pretty involved you can try this type of filtering:

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;
like image 43
Brad Rem Avatar answered Oct 18 '22 16:10

Brad Rem


I think it is because the BindingSource doesn't know what type of data it is filtering. Once a data is converted to dataset into columns and rows, filter can run. Because your datasource is a class, it can't do the automatic filtering.

like image 1
iefpw Avatar answered Oct 18 '22 15:10

iefpw