2016-06-29 10 views
0

現在、ユーザは、datagridviewの値をフィルタリングすることができます。カラム名、オペランド、および値を選択できます。DataGridviewのフィルタの既存のリストに "Contains"フィルタを追加します。

カラム名、オペランドおよび値は、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を追加したいと思います。したがって、誰かが文字列を検索したい場合は、このオペランドを使って検索できます。含まれてためにフィルタリングする

1つの簡単な方法は、次のとおりです。

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

これは一例です。 Containsオペランドを満たすために、私のApplyFilters関数を十分に汎用的にするにはどうすればよいですか?

+0

の内側にその式を入れて、あなたは、データソースとして代わりに 'DataTable'のオブジェクトの厳密に型指定されたコレクションを使用することができます?その後、LINQを使用してフィルタリングすることができます。 –

答えて

1

バインディングソースフィルタを設定する直前に、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()); 
+0

私はこの仕事をまだ私のためにすることができませんでした。あなたはそれをどうやって行うのか教えてください。 – Iason

+0

それは私が得ていたばかげたエラーでした。私は式の評価の中で2つを取り除かなければなりませんでした。なぜなら、私はすでに '{2}'でそれを行っていたからです。 – Iason

関連する問題