我正在使用BindingSource.Filter僅列出數據源的某些元素。 尤其是我這樣使用它很多:使用正則表達式的.NET BindingSource.Filter
m_bindingSourceTAnimation.Filter = "Name LIKE '" + FilterText + "'";
現在我的問題是,如果它是某種可以使用正則表達式這些過濾器。
我特別需要多個通配符(*)字符,如
*hello*world*
的感謝!
我正在使用BindingSource.Filter僅列出數據源的某些元素。 尤其是我這樣使用它很多:使用正則表達式的.NET 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)的代碼片段中分配「列表」,我認爲它會起作用。我不使用數據表,我通常堅持使用我的數據的對象,所以我不確定它將如何處理行的列表,但我認爲它會工作(或足夠接近,一點點谷歌搜索會做到這一點)。
BindingSource
依靠IBindingListView.Filter
來實現此功能。該行爲完全取決於的具體列表實現。這是DataTable
/DataView
?如果是,則映射到DataView.RowFilter
,其語法爲here。
的DataView
執行沒有正則表達式的支持,但支持通過*
LIKE
- 即其中FilterText
有點像"Foo*Bar*"
。至少,這是我的理解。
我還是假設你正在使用DataTable
/DataView
...務實的替代方法可能是引入額外的(布爾)柱爲宗旨。設置/清除標記作爲謂詞(使用正則表達式或任何其他複雜的邏輯),並使用行過濾器來說「哪裏設置」。可能不太乾淨,但比實現自定義數據視圖/綁定源更簡單。
如果您正在使用的對象(而不是DataTable
),那麼另一種選擇可能是Dynamic LINQ Library。我不知道它支持的全部範圍,但它(Where(string)
)當然有一些/很多的RowFilter
能力。並且由於示例項目中提供了代碼,因此可能是您可以教育它應用正則表達式嗎?
下面的評論並沒有真正的工作:
」 ......一個務實的替代方法可能是爲目的引入額外的(布爾)列集/清楚標記作謂語(使用。正則表達式或任何其他複雜的邏輯),並使用行過濾器來說「哪裏設置」。不是很乾淨,也許,但比實現自定義數據視圖/綁定源更簡單。「
當您設置新列時,這會導致行狀態發生變化,您基本上以整個表/數據視圖結束,認爲它需要在下一次更新中執行每行。 不知道如何解決這個問題。
我解決了這個問題,用通配符分割搜索字符串,然後使用分割值創建行過濾器表達式。
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
'[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
什麼是基礎數據源的遞歸函數?一個`DataTable`?列表? etc –
2009-05-07 14:27:21
編輯替代... – 2009-05-07 14:31:19
是的,它是一個「數據表」 – clamp 2009-05-07 15:52:16