2012-04-09 16 views
12

Sto provando a filtrare un BindingSource con un BindingList come origine dati. Ho provato BindingSource.Filter = 'Condizione di testo' Ma non ha funzionato, non succede niente, i dati sullo schermo rimangono gli stessi. Ma se uso un DataSet come origine dati funziona. È possibile filtrare un elenco di oggetti con la proprietà BindingSource.Filter?DataGridView Filtra un BindingSource con un elenco di oggetti come origine dati

Ho la seguente classe:

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

questo è come 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'"; 

Questo è solo un esempio l'idea è quella di verificare se un possibile filtrare una fonte di dati del genere . Userò la conoscenza all'interno di un nuovo progetto.

pd: L'idea è di poter utilizzare BindingSource.Filter se è possibile.

risposta

7

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

solo liste sottostanti che implementano il filtraggio supporto IBindingListView interfaccia.

BindingList<T> non sembra per implementare IBindingListView - e dal momento che è la lista sottostante, la vostra collezione non filtrerà.

BindingSource classe, mentre non generico, implementa questa interfaccia, quindi prova a utilizzarla come raccolta di personaggi. Ho la sensazione che assegnare semplicemente una nuova origine dati di BindingSource a un BindingList non sia sufficiente, poiché non modifica l'elenco sottostante. Prova:

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

Grazie !!! Con le tue informazioni ho trovato un'implementazione di IBindingListView e funziona. Ecco il link: http://blogs.msdn.com/b/winformsue/archive/2008/05/19/implementing-filtering-on-the-ibindinglistview.aspx –

+1

Mi sono imbattuto in questo paio di anni fa e questa soluzione ha funzionato bene per me. Oggi stavo usando lo stesso codice solo con un po 'di differenza: ho bisogno di due visioni di dati con lo stesso FilteredBindingList con diverse opzioni di filtro/ordinamento. qualche idea su come raggiungere questo obiettivo? – Afshin

1

Penso che sia perché BindingSource non sa che tipo di dati sta filtrando. Una volta che i dati vengono convertiti in serie di dati in colonne e righe, il filtro può essere eseguito. Poiché la tua origine dati è una classe, non può fare il filtraggio automatico.

+0

Grazie per il vostro tempo e le informazioni. –

2

In alternativa alla realizzazione IBindingListView che può essere abbastanza coinvolti si può provare questo tipo di filtraggio:

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

Grazie! Questa è un'alternativa. Ma l'idea è di essere in grado di utilizzare la proprietà BindingSource.Filter. Grazie per il tuo tempo –

Problemi correlati