BindingSource.Filterを使用して、データソースの特定の要素のみを一覧表示しています。特に私はそれをこのようにたくさん使います:
m_bindingSourceTAnimation.Filter = "Name LIKE '" + FilterText + "'";
今私の質問は、これらのフィルターで正規表現を使用することがどういうわけか可能かどうかです。
特に、次のような複数のワイルドカード(*)文字が必要です。
*hello*world*
ありがとう!
BindingSource.Filterを使用して、データソースの特定の要素のみを一覧表示しています。特に私はそれをこのようにたくさん使います:
m_bindingSourceTAnimation.Filter = "Name LIKE '" + FilterText + "'";
今私の質問は、これらのフィルターで正規表現を使用することがどういうわけか可能かどうかです。
特に、次のような複数のワイルドカード(*)文字が必要です。
*hello*world*
ありがとう!
LINQを使用してDataTableを非常に簡単にクエリでき、クエリ内で実際の正規表現を使用して、好きなようにフィルタリングできます。
このようなもの...
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();
これにより、実際の正規表現に基づいて一致する行が取得されます。情報をどのように処理する必要があるかわかりませんが、これにより、正規表現に基づいて行を取得できます。
****更新**-コメントに基づいて明確にしようとしています
これを何に使用しているのかわからないので、優れたコンテキストはありませんが、DataTableを使用してグリッドなどにデータバインドしていると推測できます。この場合、ここに入力したスニペットから「リスト」をデータソースとして割り当てることができるはずです(BindingSourceを使用していると仮定します)。これでうまくいくと思います。私はDataTablesを使用していません。通常、データを操作するためにオブジェクトに固執しているため、行のリストをどのように処理するかは正確にはわかりませんが、機能すると思います(または、少しグーグル検索するのに十分近いですそれをします)。
BindingSourceIBindingListView.Filterこの機能に依存しています。動作は、特定のリストの実装に完全に依存します。これはDataTable/DataViewですか?その場合、これはにマップされDataView.RowFilter、構文はここにリストされています。
実装には正規表現のサポートはありませんが、-を介してDataViewサポートされます。つまり、は。のようなものです。少なくとも、それは私の理解です。LIKE*FilterText"Foo*Bar*"
私はまだあなたがDataTable/を使用していると仮定していますDataView...実用的な代替手段は、目的のために余分な(ブール)列を導入することかもしれません。そのマーカーを述語として設定/クリアし(正規表現またはその他の複雑なロジックを使用)、行フィルターを使用して「設定された場所」と言います。あまりきれいではないかもしれませんが、カスタムデータビュー/バインディングソースを実装するよりもはるかに簡単です。
(ではなく)オブジェクトを使用している場合、別のオプションは動的LINQライブラリDataTableである可能性があります。私はそれが何をサポートするのか完全な範囲を知りませんが、それは確かにいくつかの/多くの機能を持っています。また、サンプルプロジェクトでコードを利用できるので、正規表現を適用するようにコードを教育することは可能ですか?Where(string)RowFilter
以下のコメントは実際には機能しません。
「...実用的な代替手段は、目的のために追加の(ブール)列を導入することです。そのマーカーを述語として設定/クリアし(正規表現またはその他の複雑なロジックを使用)、行フィルターを使用して「」と言います。 where set "。あまりきれいではないかもしれませんが、カスタムデータビュー/バインディングソースを実装するよりもはるかに簡単です。"
新しい列を設定すると、行の状態が変化し、基本的に、テーブル/データビュー全体が次の更新ですべての行を実行する必要があると考えることになります。この問題を回避する方法がわかりません。
検索文字列をワイルドカードで分割し、分割値を使用して行フィルター式を作成することで、この問題を解決しました。
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() + "')";
}
複数のワイルドカードを使用する場合は、フィルター表現を作成する再帰関数を作成できます
'[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