使用BindingList过滤DataGridView

时间:2017-08-08 13:42:59

标签: .net datagridview filtering bindingsource

我已经使用DataGridView创建了一个WinForms应用程序,我想过滤它。它的设置如下:

目录条目:

public class CatalogueEntry
{
    private string _code;
    private string _desc;

    public CatalogueEntry(string code, string desc)
    {
        _code = code;
        _desc = desc;
    }

    public string Code => _code;
    public string Description => _desc;
}

目录列表(使用BindingList):

public class Catalogue : BindingList<CatalogueEntry>
{

}

初​​始化:

_catalogue = new Catalogue();

_catalogue.Add(new CatalogueEntry("BAGG", "It scares us all"));
_catalogue.Add(new CatalogueEntry("BIGG", "It embiggens us all"));
_catalogue.Add(new CatalogueEntry("BOGG", "It demeans us all"));
_catalogue.Add(new CatalogueEntry("BUGG", "It frightens us all"));

_source = new BindingSource();
_source.DataSource = _catalogue;

dataGridView.DataSource = _source;

我得到了一个很好的上述数据网格。

如果我尝试按如下方式在BindingSource上设置过滤器:

var filter = "Description like 'scares'";
_source.Filter = filter;

没有任何反应,即过滤器看起来不起作用。我该怎么做才能使过滤器工作?

我猜测基础数据源并不是一个数据库,所以不会理解&#34;描述就像&#39;吓唬&#39;&#34;。

编辑:如果我更改我的过滤器如下:

var text = "scares";
var list = _catalogue.Where(entry => entry.Description.Contains(text));
_source.DataSource = list;

然后根据需要过滤;但是这改变了清单。这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您选中_source.SupportsFiltering,则会发现它是False。根据{{​​3}}上的MSDN文档:

  

只有实现BindingSource.Filter接口的基础列表才支持过滤。

BindingList没有:

public class BindingList<T> : Collection<T>, IBindingList, IList, ICollection, IEnumerable, ICancelAddNew, IRaiseItemChangedEvents

虽然您拥有的内容足以满足简单目的,但如果您需要实际过滤而不更改DataSource,则可以:

  1. 查找由其他用户创建的IBindingListView库的通用实现。
  2. 推出自己的实施(很多工作,但更可定制)。
  3. 重组 - 改为DataTable