2009-05-04 35 views
5

我正在使用BindingSource.Filter僅列出數據源的某些元素。 尤其是我這樣使用它很多:使用正則表達式的.NET BindingSource.Filter

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

現在我的問題是,如果它是某種可以使用正則表達式這些過濾器。

我特別需要多個通配符(*)字符,如

*hello*world* 

的感謝!

+0

什麼是基礎數據源的遞歸函數?一個`DataTable`?列表? etc – 2009-05-07 14:27:21

+0

編輯替代... – 2009-05-07 14:31:19

+0

是的,它是一個「數據表」 – clamp 2009-05-07 15:52:16

回答

10

你可以很容易地用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)的代碼片段中分配「列表」,我認爲它會起作用。我不使用數據表,我通常堅持使用我的數據的對象,所以我不確定它將如何處理行的列表,但我認爲它會工作(或足夠接近,一點點谷歌搜索會做到這一點)。

5

BindingSource依靠IBindingListView.Filter來實現此功能。該行爲完全取決於的具體列表實現。這是DataTable/DataView?如果是,則映射到DataView.RowFilter,其語法爲here

DataView執行沒有正則表達式的支持,但支持通過*LIKE - 即其中FilterText有點像"Foo*Bar*"。至少,這是我的理解。


我還是假設你正在使用DataTable/DataView ...務實的替代方法可能是引入額外的(布爾)柱爲宗旨。設置/清除標記作爲謂詞(使用正則表達式或任何其他複雜的邏輯),並使用行過濾器來說「哪裏設置」。可能不太乾淨,但比實現自定義數據視圖/綁定源更簡單。


如果您正在使用的對象(而不是DataTable),那麼另一種選擇可能是Dynamic LINQ Library。我不知道它支持的全部範圍,但它(Where(string))當然有一些/很多的RowFilter能力。並且由於示例項目中提供了代碼,因此可能是您可以教育它應用正則表達式嗎?

1

下面的評論並沒有真正的工作:

」 ......一個務實的替代方法可能是爲目的引入額外的(布爾)列集/清楚標記作謂語(使用。正則表達式或任何其他複雜的邏輯),並使用行過濾器來說「哪裏設置」。不是很乾淨,也許,但比實現自定義數據視圖/綁定源更簡單。「

當您設置新列時,這會導致行狀態發生變化,您基本上以整個表/數據視圖結束,認爲它需要在下一次更新中執行每行。 不知道如何解決這個問題。

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