2012-04-09 61 views
12

Estoy tratando de filtrar un BindingSource con un BindingList como fuente de datos. Intenté BindingSource.Filter = 'Condición del texto' Pero no funcionó, no pasa nada, los datos en la pantalla siguen siendo los mismos. Pero si uso un DataSet como fuente de datos, funciona. ¿Es posible filtrar una lista de objetos con la propiedad BindingSource.Filter?DataGridView Filtrar un BindingSource con una lista de objetos como DataSource

tengo la clase siguiente:

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

Así es como yo lo uso:

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

Este es sólo un ejemplo, la idea es probar si una puede filtrar una fuente de datos de esa . Utilizaré el conocimiento dentro de un nuevo proyecto.

pd: La idea es poder usar BindingSource.Filter si es posible.

Respuesta

7

Según http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.filter.aspx

listas Sólo subyacentes que implementan el filtrado de apoyo IBindingListView interfaz.

BindingList<T> no parece aplicar IBindingListView - y puesto que es la lista de subyacente, su colección no filtrará.

BindingSource clase, aunque no es genérico, implementa esta interfaz, así que intente utilizar esto como su colección de personajes. Tengo la sensación de que simplemente asignar un nuevo origen de datos de BindingSource a una BindingList no será suficiente, ya que no cambia la lista subyacente. Proveedores:

BindingSource personas = new BindingSource { new Person{ ... }, ... }; 
+1

Gracias !!! Con su información encontré una implementación de IBindingListView y funciona. Aquí está el enlace: http://blogs.msdn.com/b/winformsue/archive/2008/05/19/implementing-filtering-on-the-ibindinglistview.aspx –

+1

Me encontré con este par de años y esta solución funcionó bien para mí Hoy estaba usando el mismo código solo con una pequeña diferencia: necesito dos datagridviews para mostrar la misma FilteredBindingList con diferentes opciones de filtrado/clasificación. alguna idea sobre cómo lograr esto? – Afshin

1

Creo que es porque BindingSource no sabe qué tipo de datos está filtrando. Una vez que los datos se convierten en conjunto de datos en columnas y filas, se puede ejecutar el filtro. Debido a que su fuente de datos es una clase, no puede hacer el filtrado automático.

+0

Gracias por su tiempo e información. –

2

Como alternativa a la implementación de IBindingListView que puede ser muy involucrado puede probar este tipo de filtrado:

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; 
+0

¡Gracias! Esa es una alternativa. Pero la idea es poder usar la propiedad BindingSource.Filter. Gracias por tu tiempo –

Cuestiones relacionadas