代码之家  ›  专栏  ›  技术社区  ›  imekon

使用BindingList筛选DataGridView

  •  1
  • imekon  · 技术社区  · 7 年前

    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;
    

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

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

    什么都没有发生,即过滤器似乎不工作。我该怎么做才能让过滤器工作?

    我猜底层数据源不是一个数据库,所以不会理解“像‘恐慌’一样的描述”。

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   OhBeWise    7 年前

    如果你检查 _source.SupportsFiltering False .根据MSDN文件 BindingSource.Filter :

    IBindingListView 接口支持过滤。

    哪一个 BindingList

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

    虽然您所拥有的将满足简单目的,但如果您需要真正的过滤,而不改变 DataSource

    1. 查找的通用实现 IBindingListView 其他用户创建的库。
    2. 推出您自己的实现(需要大量工作,但更具可定制性)。
    3. DataTable 相反