将“包含”过滤器添加到datagridview

时间:2016-06-29 12:12:33

标签: c# .net datagridview

我目前允许用户通过让他们选择列名,操作数和值来过滤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;
    }

这适用于您可能想要应用的过滤器。我当前的可用操作数列表是:{=,&gt;,&lt;,&gt; =,&lt; =,&lt;&gt;}。现在我想添加一个操作数,包含。因此,如果有人想要搜索字符串列,他们可以通过此操作数进行搜索。

过滤Contains的一种简单方法是:

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

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

1 个答案:

答案 0 :(得分:1)

在设置绑定源过滤器之前,有条件地设置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());