C# DataGridView使用对象列表作为数据源筛选BindingSource

C# DataGridView使用对象列表作为数据源筛选BindingSource,c#,winforms,C#,Winforms,我正在尝试使用BindingList作为数据源筛选BindingSource。我尝试了BindingSource.Filter='Text-Condition',但没有成功,什么都没有发生,屏幕上的数据保持不变。但如果我使用数据集作为数据源,它就可以工作。是否可以使用BindingSource.filter属性筛选对象列表 我有以下课程: class Person { public String Nombre { get; set; }

我正在尝试使用BindingList作为数据源筛选BindingSource。我尝试了BindingSource.Filter='Text-Condition',但没有成功,什么都没有发生,屏幕上的数据保持不变。但如果我使用数据集作为数据源,它就可以工作。是否可以使用BindingSource.filter属性筛选对象列表

我有以下课程:

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'";
BindingList角色=新的BindingList{
新人{Apellido=“App1”,DNI=3011,Edad=20,Nombre=“Name1”,Tamano=new decimal(1.7)}
,新人{Apellido=“App2”,DNI=1520,Edad=30,Nombre=“Name2”,Tamano=new decimal(1.5)}
,新人{Apellido=“App3”,DNI=5654,Edad=21,Nombre=“Name3”,Tamano=new decimal(1.6)}
,新人{Apellido=“App4”,DNI=778,Edad=40,Nombre=“Name4”,Tamano=new decimal(1.68)}
};
BindingSource bs=新的BindingSource();
bs.DataSource=personas;
grid.DataSource=bs;
bs.Filter=“类似Apellido的'App1';
这只是一个例子,其目的是测试一个用户是否可以过滤这样的数据源。我将在一个新项目中使用这些知识


pd:想法是能够使用BindingSource。如果可能的话进行过滤。

我认为这是因为BindingSource不知道它过滤的是什么类型的数据。将数据转换为数据集并转换为列和行后,即可运行筛选器。因为您的数据源是一个类,所以它不能进行自动筛选

根据

只有实现
IBindingListView
接口的基础列表支持筛选

似乎没有实现-而且由于它是基础列表,您的集合将不会过滤

类虽然不是泛型的,但确实实现了此接口,所以请尝试将其用作您的角色集合。我觉得简单地将新BindingSource的数据源分配给BindingList是不够的,因为它不会改变底层列表。尝试:

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

作为实现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;
BindingList角色=新的BindingList{
新人{Apellido=“App1”,DNI=3011,Edad=20,Nombre=“Name1”,Tamano=new decimal(1.7)}
,新人{Apellido=“App2”,DNI=1520,Edad=30,Nombre=“Name2”,Tamano=new decimal(1.5)}
,新人{Apellido=“App3”,DNI=5654,Edad=21,Nombre=“Name3”,Tamano=new decimal(1.6)}
,新人{Apellido=“App4”,DNI=778,Edad=40,Nombre=“Name4”,Tamano=new decimal(1.68)}
};
BindingList filtered=新的BindingList(personas.Where(
p=>p.Apellido.Contains(“App1”)).ToList();
grid.DataSource=已过滤;

谢谢!!!根据您的信息,我找到了IBindingListView的一个实现,它可以正常工作。这里是链接:我在几年前遇到了这个问题,这个解决方案对我来说很好。今天我使用的是相同的代码,只是有一点不同:需要两个DataGridView显示相同的FilteredBindingList,具有不同的筛选/排序选项。关于如何实现这一点有什么想法吗?@Müsli链接不起作用,你能在绑定列表上分享你的实现吗?链接已经死了,你能分享一下你是如何解决这个问题的吗?谢谢!这是另一种选择。但我们的想法是能够使用BindingSource.Filter属性。谢谢你的时间