使用 BindingList 过滤 DataGridView
Filtering a DataGridView with a BindingList
我创建了一个带有 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;
没有任何反应,即过滤器似乎不起作用。我该怎么做才能使过滤器正常工作?
我猜底层数据源不是数据库,所以无法理解 "Description like 'scares'"。
编辑:如果我按如下方式更改过滤器:
var text = "scares";
var list = _catalogue.Where(entry => entry.Description.Contains(text));
_source.DataSource = list;
然后根据需要过滤;然而,这正在改变列表。这是正确的做法吗?
如果您检查 _source.SupportsFiltering
,您会发现它是 False
。根据 BindingSource.Filter
上的 MSDN 文档:
Only underlying lists that implement the IBindingListView interface support filtering.
BindingList
没有:
public class BindingList<T> : Collection<T>, IBindingList, IList, ICollection, IEnumerable, ICancelAddNew, IRaiseItemChangedEvents
虽然您拥有的内容足以满足简单的目的,但如果您需要在不更改 DataSource
的情况下进行真正的过滤,您可以:
- 查找其他用户创建的
IBindingListView
库的通用实现。
- 推出您自己的实施(需要大量工作,但更可定制)。
- 重组 - 想想
DataTable
。
我创建了一个带有 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;
没有任何反应,即过滤器似乎不起作用。我该怎么做才能使过滤器正常工作?
我猜底层数据源不是数据库,所以无法理解 "Description like 'scares'"。
编辑:如果我按如下方式更改过滤器:
var text = "scares";
var list = _catalogue.Where(entry => entry.Description.Contains(text));
_source.DataSource = list;
然后根据需要过滤;然而,这正在改变列表。这是正确的做法吗?
如果您检查 _source.SupportsFiltering
,您会发现它是 False
。根据 BindingSource.Filter
上的 MSDN 文档:
Only underlying lists that implement the IBindingListView interface support filtering.
BindingList
没有:
public class BindingList<T> : Collection<T>, IBindingList, IList, ICollection, IEnumerable, ICancelAddNew, IRaiseItemChangedEvents
虽然您拥有的内容足以满足简单的目的,但如果您需要在不更改 DataSource
的情况下进行真正的过滤,您可以:
- 查找其他用户创建的
IBindingListView
库的通用实现。 - 推出您自己的实施(需要大量工作,但更可定制)。
- 重组 - 想想
DataTable
。