2012-04-09 10 views
12

Próbuję filtrować BindingSource z BindingList jako Datasource. Próbowałem BindingSource.Filter = 'Text Condition' Ale to nie działało, nic się nie dzieje, dane na ekranie pozostają takie same. Ale jeśli używam DataSet jako źródła danych, które działa. Czy można filtrować listę obiektów za pomocą właściwości BindingSource.Filter?DataGridView Filtrowanie źródła BindingSource z listą obiektów jako DataSource

Mam następujące klasy:

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

to jak go używać:

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

Jest to tylko przykład idea jest sprawdzenie, czy można filtrować źródło danych takiego . Wykorzystam wiedzę w nowym projekcie.

pd: Pomysł polega na umożliwieniu użycia BindingSource.Filter, jeśli jest to możliwe.

Odpowiedz

7

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

Tylko bazowych listach, które wdrażają wsparcia filtrowania IBindingListView interfejsu.

BindingList<T> nie wydaje się wdrożenie IBindingListView - a ponieważ jest to podstawowa lista, kolekcja nie będzie filtrować.

BindingSource Zaimplementowanie tego interfejsu nie jest generyczne, więc spróbuj użyć go jako swojej kolekcji person. Mam wrażenie, że po prostu przypisanie źródła danych nowego źródła BindingSource do BindingList nie wystarczy, ponieważ nie zmienia on podstawowej listy. Spróbuj:

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

Dzięki! Z twoimi informacjami znalazłem implementację IBindingListView i to działa. Oto link: http://blogs.msdn.com/b/winformsue/archive/2008/05/19/implementing-filtering-on-the-ibindinglistview.aspx –

+1

Natknąłem się na to kilka lat temu i to rozwiązanie pracował dla mnie dobrze. Dzisiaj używałem tego samego kodu z odrobiną różnicy: potrzeba dwóch datagridviews wyświetlających tę samą listę FilteredBindingList z różnymi opcjami filtrowania/sortowania. wszelkie myśli o tym, jak to osiągnąć? – Afshin

1

Myślę, że dzieje się tak, ponieważ BindingSource nie wie, jaki typ danych filtruje. Po przekonwertowaniu danych na zestaw danych w kolumnach i wierszach można uruchomić filtr. Ponieważ twoje źródło danych jest klasą, nie może przeprowadzić automatycznego filtrowania.

+0

Dziękuję za poświęcony czas i informacji. –

2

jako alternatywa do realizacji IBindingListView które mogą być dość zaangażowany można spróbować tego typu filtrowania:

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

Dzięki! To alternatywa. Ale chodzi o to, aby móc korzystać z właściwości BindingSource.Filter. Dziękuję za Twój czas –

Powiązane problemy