【问题标题】:Filtering a DataGridView with a BindingList使用 BindingList 过滤 DataGridView
【发布时间】:2017-08-08 13:42:58
【问题描述】:

我创建了一个带有 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;

没有任何反应,即过滤器似乎不起作用。我该怎么做才能让过滤器正常工作?

我猜底层数据源不是数据库,所以不会理解“像 'scares' 这样的描述”。

编辑:如果我按如下方式更改过滤器:

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

然后根据需要进行过滤;然而,这正在改变列表。这是正确的做法吗?

【问题讨论】:

    标签: .net datagridview filtering bindingsource


    【解决方案1】:

    如果您查看_source.SupportsFiltering,您会发现它是False。根据BindingSource.Filter 上的 MSDN 文档:

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

    BindingList 没有:

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

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

    1. 查找由其他用户创建的IBindingListView 库的通用实现。
    2. 滚动您自己的实现(工作量很大,但更可定制)。
    3. 重组 - 改用 DataTable

    【讨论】:

    • 我选择了选项 2 - 如果默认的基本版本遇到“未实现”异常之一,则只需实现功能。过滤工作正常。另外,我只需要实现 IBindingListView,因为它包括 IBindingList
    • 太棒了!对我帖子中的那个错误感到抱歉。我刚刚意识到我在我的选项中说实现IBindingList 而不是IBindingListView,但我很高兴你正确地解释了我的意思。 - 编辑更正。
    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多