我目前允许用户通过让他们选择列名,操作数和值来过滤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函数足够通用以满足包含操作数?
答案 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());