【问题标题】:Filter BindingSource when DataSource is a BindingList当 DataSource 是 BindingList 时过滤 BindingSource
【发布时间】:2016-02-22 17:45:27
【问题描述】:

我从 Excel 表中读取并为 BindingList 编写了此内容,在 Form_Load 中将其设置为 DataSource 作为 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

这工作很好! 我打算创建一个组合框作为这个 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();

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

【问题讨论】:

  • 如果数据网格在另一个容器控件中,您可能还需要刷新该控件。
  • 需要刷新表单吗?

标签: c# .net winforms datagridview bindingsource


【解决方案1】:

您不能使用Filter 属性来过滤BindingSource,它的DataSource 设置为BindingList&lt;T&gt;

仅实现IBindingListView 接口的底层列表 支持过滤。

您可以使用 Linq 过滤BindingList&lt;T&gt;

var filteredBindingList= new BindingList<T>(bindingList.Where(x=>some criteria).ToList());

那么就可以使用过滤后的绑定列表作为数据源了。

【讨论】:

  • @Franklin BindingSource.Filter 真正影响您的源的唯一方法是,如果基本源集合实现IBindingListView,如here 所讨论的那样。否则这个解决方案就是你的答案。
  • @Reza Aghaei 带有DataSource = filteredBindingList 的列表框在将某些元素添加到bindingList 时不会更新。 bindingList.ResetBindings()filteredBindingList.ResetBindings() 没有帮助。有没有办法用动态过滤的数据源制作一个ListBox?提前谢谢你,
  • @Olexa 一种解决方案是监听绑定列表的ListChanged事件,重新设置列表框的数据源。
  • 值得一提的是,在 LINQ 中使用此解决方案 (ToList()) 不会过滤列表,而是使用过滤条件创建一个新列表,因此需要考虑性能/内存影响根据调用此类功能的次数。
  • 这将创建一个新的 BindingList。当您将新项目添加到原始列表时,filteredBindingList 将无法看到。
【解决方案2】:

你可以试试:

    bd.resetBindings(false)

祝你好运

更新

我会尝试这样的:

    bd.Filter = string.Format("TAG_FAZENDA like '%{0}%'", cbTagFaz.Text);
    gvFiltro.resetbindings(false)
    gvFiltro.Update();

    bindNav.resetbindings(false)
    bindNav.Update();

就这个。

【讨论】:

  • 我在私有 System.Windows.Forms.DataGridView gvFiltro 的方法列表中找不到这个;
  • 是的,很抱歉 - 我的自定义 DatagridView 有它。请参阅上面的更新信息。
  • 我也试过了,但是不行。这个过滤器表达式正确吗?列名是 TAG_FAZENDA ,我相信这是正确的。 DataGridView 返回所有行,而不是过滤后的行。
  • 您是否确认(在调试模式下)过滤器参数是否正确显示?在此行之后设置断点并检查过滤器语法。
  • 此 ResetBindings 仅存在于 BindingSource 类中。感谢您抽出宝贵时间,很遗憾没有工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2014-02-13
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多