2009-05-04 26 views
5

私はBindingSource.Filterを使用して、データソースの特定の要素のみを一覧表示しています。 は、特に私はこの多くのようにそれを使用します。.NET BindingSource.Filter正規表現

m_bindingSourceTAnimation.Filter = "Name LIKE '" + FilterText + "'"; 

今、私の質問ですが、それはこれらのフィルタと正規表現を使用して何とか可能である場合。

私は特に

*hello*world* 

おかげのように複数のワイルドカード(*)文字が必要になります!

+0

基礎となるデータソースは何を作成する再帰関数を作成することができますか? 'DataTable'ですか?リスト? –

+0

別の方法で編集中... –

+0

はい、「データテーブル」 – clamp

答えて

10

LINQを使用してDataTableを簡単にクエリできます。そして、クエリ内の実際のRegexを使用して、好きなようにフィルタすることができます。このような

何か...これはあなたの実際の正規表現に基づいて一致する行を取得します

var source = myDataTable.AsEnumerable(); 

var results = from matchingItem in source 
       where Regex.IsMatch(matchingItem.Field<string>("Name"), "<put Regex here>") 
       select matchingItem; 

//If you need them as a list when you are done (to bind to or something) 
var list = results.ToList(); 

、私はあなたが情報に何をする必要があるか分からないが、これはあなたを許しますRegexに基づいて行を取得します。

****アップデートが** - 私はあなたが私は偉大なコンテキストを持っていないためにこれを使用しているかわからないコメント

に基づいて解明しようとすると、私はあなたを推測することができるものからグリッドやそれに類するものにデータをバインドするためにDataTableを使用しています。これが当てはまる場合は、データソースとしてここに入れたスニペットから「リスト」を割り当てることができるはずです(BindingSourceを使用していると仮定した場合)。私はDataTableを使用しません、私は通常、私のデータで作業するためのオブジェクトに固執するので、私はそれが行のリストを処理する方法は正確にはわかりませんが、私はそれが動作すると思うだろう(または、それを行うだろう)。

+0

ありがとう、しかし、私は以前にLINQを使用したことがありません。どのように私はBindingSourceを持っている私のC#のコードの中でそれを使うことができますか? – clamp

+0

はい、データテーブルは、DataGridView – clamp

5

BindingSourceは、この機能にはIBindingListView.Filterが依存しています。その動作は、特定のリストの実装では完全にに依存します。これはDataTable/DataViewですか?その場合はにマップされ、構文はhereと記載されています。

DataView実装には正規表現をサポートしていませんが、*経由LIKEをサポート - FilterText"Foo*Bar*"のようなものである、すなわち場所。少なくとも、それは私の理解です。


私はまだ実用的な代替は、目的のために余分な(ブール値)欄を導入するかもしれない...あなたはDataTable/DataViewを使用していると仮定しています。そのマーカを述語として(正規表現や他の複雑なロジックを使用して)設定/クリアし、行フィルタを使用して「どこに設定するか」と言うだけです。きれいではないかもしれませんが、カスタムデータビュー/バインディングソースを実装するよりもずっと簡単です。あなたは(というよりもDataTable)オブジェクトを使用している場合は


、その後、別のオプションは、Dynamic LINQ Libraryかもしれません。私はそれがサポートするものの全範囲を知らないが、それは確かにRowFilter能力のいくつか/多くを持っている(Where(string))。コードはサンプルプロジェクトで利用可能なので、が可能です。正規表現を適用するためにそれを教えることができますか?

+0

ありがとうございます。これはほとんど動作しますが、単語の途中では理解できないように見えますが、始めと終わりに限り、このように: * test * 私は本当に単語の真ん中にそれを必要とします。 :-) – clamp

+0

ありがとう、私はあなたが何を意味するのか理解していると思うが、フィルタリングしたい正規表現を適用するすべての文字列のカスタムリストを作成する必要があります。すでに.NETにこれには何かがあるのでしょうか、私自身の正規表現を行う必要がありますか? – clamp

+0

Regexは.NETに組み込まれていますが、残念ながら私は残りのコメントに従っていませんでした。 –

1

以下のコメントは、実際に動作しません:

は」...実用的な代替が目的のために余分な(ブール値)欄を導入するかもしれない述語としてマーカーが(使用していることを設定/クリア。正規表現やその他の複雑なロジック)を使用して、 "where set"と言うように行フィルタを使用してください。あまりクリーンではないかもしれませんが、カスタムデータビュー/バインディングソースを実装するよりも、

新しい列を設定すると、行の状態が変化し、基本的にテーブル/データビュー全体が次の更新ですべての行を処理する必要があると考えられます。 この問題を回避する方法が不明です。

1

検索文字列をワイルドカードで分割してこの問題を解決し、分割値を使用して行フィルタ式を作成しました。

Array a = SearchString.Split('*'); 
string rowFilter = ""; 

if (a.GetUpperBound(0) == 1) 
{ 

    rowFilter = "(MODEL_NBR like '" + a.GetValue(0).ToString() + "*' AND MODEL_NBR like '*"  + a.GetValue(1).ToString() + "')"; 

} 

あなたが複数のワイルドカードを使用する場合は、フィルタexpressio

0
'[Description] Is column name 
    Dim SearchStrArr() As String = Split(txtSearch.Text, " ") 
    Dim FilterString As String = "" 
    FilterString = String.Join("%' AND [Description] Like '%", SearchStrArr) 
    FilterString = "[Description] Like '%" & FilterString & "%'" 

    m_bindingSourceTAnimation.Filter = FilterString