当 DataSource 是 BindingList 时过滤 BindingSource

Fra*_*rio 3 .net c# datagridview bindingsource winforms

我从excel表中读取并为BindingList写了这个,在Form_Load中,它被设置为一个数据源作为BindingSource:

bd = new BindingSource(); //instance of BindingSource
bd.DataSource = ExcelOPS.LerExcel(); //LerExcel() method return a BindingList<T>

gvFiltro.DataSource = bd; //set a DataGridView named gvFiltro DataSource property
bindNav.BindingSource = bd; //set a BindingNavigator source
Run Code Online (Sandbox Code Playgroud)

这工作很好!我打算为此 DataGridView gvFiltro 创建一个组合框作为过滤器,因此在组合框的 SelectedIndexChanged 事件中,我尝试这样做:

this.gvFiltro.DataSource = null;
bd.Filter = string.Format("TAG_FAZENDA like '%{0}%'", cbTagFaz.Text);
gvFiltro.DataSource = bd;
gvFiltro.Update();
gvFiltro.Refresh();

bindNav.BindingSource = bd;
bindNav.Update();
bindNav.Refresh();
Run Code Online (Sandbox Code Playgroud)

但是 DataGridView 不会改变。我错过了什么?

Rez*_*aei 5

您不能使用Filter属性来过滤BindingSourceDataSource设置为 a 的 a BindingList<T>

只有实现该IBindingListView接口的底层列表才支持过滤。

您可以BindingList<T>使用 Linq过滤:

var filteredBindingList= new BindingList<T>(bindingList.Where(x=>some criteria).ToList());
Run Code Online (Sandbox Code Playgroud)

然后您可以使用过滤后的绑定列表作为数据源。

  • @Franklin `BindingSource.Filter` 真正影响你的源代码的唯一方法是,如果基础源代码集合实现了 `IBindingListView`,如[此处](http://stackoverflow.com/a/10074142/3773066) 所讨论的那样。否则,此解决方案就是您的答案。 (2认同)