添加“Contains"筛选到datagridview中现有的筛选器列表

本文关键字:筛选 列表 datagridview Contains quot 添加 | 更新日期: 2023-09-27 17:53:12

我目前允许用户通过选择列名、操作数和值来筛选datagridview的值。

列名、操作数和值保存到ColumnFilter实例中。用户还可以为网格设置多个过滤器。我实际的过滤是这样的:

public void ApplyFilters(List<ColumnFilter> filters)
    {
        BindingSource bs = (BindingSource)dataGridView1.DataSource;
        bs.Filter  = string.Join(" AND ", filters.Select(filter=>string.Format("{0} {1} '{2}'", filter.ColumnName, filter.Operand, filter.Value)).ToArray());
        dataGridView1.DataSource = bs;
    }

对于您可能想要应用的许多过滤器都可以很好地工作。我当前可用的操作数列表是:{=,>,<,>=,<=,<>}。现在我想再添加一个操作数,即Contains。如果有人想搜索字符串列,他们可以通过这个操作数。

筛选Contains的一个简单方法是:

var dt = (DataTable)dataGridView1.DataSource;
        dt.DefaultView.RowFilter = string.Format("Column like '%{0}%'", txtBoxSearch.Text.Trim().Replace("'", "''"));
        dataGridView1.DataSource = dt;

这只是一个例子。我如何使我的ApplyFilters函数足够通用,以满足包含操作数?

添加“Contains"筛选到datagridview中现有的筛选器列表

在设置绑定源过滤器之前,先有条件地设置filter.Value

filter.Value = filter.Operand == "like" ? "'%" + filter.Value + "%'" : filter.Value;

然而,灵活过滤仍然比这更复杂。如果列不是文本数据怎么办?

更新

代替我所说的,把表达式放入你的Select

bs.Filter  = string.Join(" AND ", 
    filters.Select(filter=>string.Format("{0} {1} '{2}'", 
    filter.ColumnName, filter.Operand, 
    filter.Operand == "like" ? "'%" + filter.Value + "%'" : filter.Value)).ToArray());