2012-04-09 7 views
12

Ich versuche, eine BindingSource mit einer BindingList als Datenquelle zu filtern. Ich habe versucht, BindingSource.Filter = 'Text Condition' Aber es hat nicht funktioniert, passiert nichts, die Daten auf dem Bildschirm bleibt gleich. Aber wenn ich ein DataSet als Datenquelle verwende, funktioniert es. Ist es möglich, eine Liste von Objekten mit der BindingSource.Filter-Eigenschaft zu filtern?DataGridView Eine BindingSource mit einer Objektliste als DataSource filtern

Ich habe die folgende Klasse:

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

Dies ist, wie ich es verwenden:

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

Dies ist nur ein Beispiel der Idee zu testen, ob ein eine Datenquelle wie das filtert . Ich werde das Wissen in einem neuen Projekt verwenden.

pd: Die Idee ist BindingSource.Filter zu verwenden, wenn es möglich ist.

Antwort

7

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

Nur zugrunde liegenden Listen, die die IBindingListView Schnittstelle Unterstützung Filterung implementieren.

BindingList<T> erscheint nicht IBindingListView zu implementieren - und da es die zugrunde liegende Liste ist, wird Ihre Sammlung nicht filtern.

BindingSource Klasse, obwohl nicht generisch, implementiert diese Schnittstelle, also versuchen Sie es als Ihre Personas Sammlung. Ich habe das Gefühl, dass das einfache Zuweisen einer neuen BindingSource-Datenquelle zu einer BindingList nicht ausreicht, da sie die zugrunde liegende Liste nicht ändert. Versuchen:

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

Danke !!! Mit Ihren Informationen fand ich eine Implementierung von IBindingListView und es funktioniert. Hier ist der Link: http://blogs.msdn.com/b/winformsue/archive/2008/05/19/implementing-filtering-on-the-ibindinglistview.aspx –

+1

Ich stieß auf diese paar Jahre und diese Lösung hat gut für mich funktioniert. Heute habe ich den gleichen Code nur mit einem kleinen Unterschied verwendet: zwei Datagridviews müssen dieselbe FilteredBindingList mit verschiedenen Filter-/Sortieroptionen anzeigen. irgendwelche Gedanken darüber, wie dies zu erreichen ist? – Afshin

1

Ich denke, es ist, weil die BindingSource nicht wissen, welche Art von Daten es filtert. Sobald Daten in Datensätze in Spalten und Zeilen konvertiert wurden, kann der Filter ausgeführt werden. Da Ihre Datenquelle eine Klasse ist, kann sie die automatische Filterung nicht durchführen.

+0

Vielen Dank für Ihre Zeit und Informationen. –

2

Als Alternative zu IBindingListView Implementierung, die ziemlich beteiligt sein können Sie diese Art der Filterung versuchen:

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

Danke! Das ist eine Alternative. Die Idee ist jedoch, die BindingSource.Filter-Eigenschaft verwenden zu können. Vielen Dank für Ihre Zeit –

Verwandte Themen