2012-04-09 90 views
12

我试图筛选的BindingSource用的BindingList作为数据源。我试过BindingSource.Filter ='Text Condition'但它没有工作,没有任何反应,屏幕上的数据保持不变。但是,如果我使用DataSet作为它的数据源的作品。是否可以使用BindingSource.Filter属性过滤对象列表?的DataGridView过滤一个BindingSource的与对象的列表作为数据源

我有以下类:

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

这是我如何使用它:

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

这只是一个例子想法是测试是否可以过滤这样的一个数据源。我将使用新项目中的知识。

PD:我们的想法是能够使用BindingSource.Filter如果可能的话。

回答

7

按照实现该IBindingListView接口支持过滤http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.filter.aspx

只有基础列表。

BindingList<T>似乎并没有实现IBindingListView - 而且因为它是基础列表,你的收藏将不会进行筛选。

BindingSource类,而不是通用的,确实实现了这个接口,所以尽量使用这个作为你的角色的集合。我觉得简单地将一个新的BindingSource的数据源分配给一个BindingList是不够的,因为它不会改变基础列表。尝试:

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

谢谢!有了你的信息,我发现IBindingListView的实现,它的工作原理。这里是链接:http://blogs.msdn.com/b/winformsue/archive/2008/05/19/implementing-filtering-on-the-ibindinglistview.aspx – 2012-04-09 14:20:48

+1

我碰到这个前几年,该溶液来为我工作得很好。今天我使用相同的代码只是有点不同:需要两个datagridviews显示相同的FilteredBindingList具有不同的过滤/排序选项。 有关如何实现这一目标的任何想法? – Afshin 2015-07-29 00:38:06

1

我想这是因为BindingSource的不知道它是过滤什么类型的数据。将数据转换为数据集后,可以运行过滤器。因为你的数据源是一个类,所以它不能进行自动过滤。

+0

感谢您的时间和信息。 – 2012-04-09 14:21:11

2

作为替代实施IBindingListView可漂亮参与,你可以尝试这种类型的过滤器:

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

谢谢!这是一个替代方案。但想法是能够使用BindingSource.Filter属性。谢谢你的时间 – 2012-04-09 14:22:13

相关问题