2012-06-18 39 views
0

你好我有一個數據表,我想過濾一個單一的文本框,不區分大小寫。換句話說,當用戶開始輸入文本框時,我希望RowFilter顯示包含輸入信息的任何行(不管大小寫)。數據表過濾(多列)

我目前的代碼只顯示精確匹配,並且只顯示單個列(「ID」)。還有一些其他欄目,我想包括,即「標題」,「用戶名」,「公司」等。

任何想法?

private void searchTextBox_TextChanged(object sender, EventArgs e) 
{ 
    if (searchTextBox.Text.Trim() != "") 
    { 
     gridToTable.DefaultView.RowFilter = "ID = " + searchTextBox.Text; 
    } 
    else 
    { 
     gridToTable.DefaultView.RowFilter = string.Empty; 

    } 

} 
+0

您可以使用LINQ to DataTable替換RowFilter - 它功能更多,並允許創建自己的自定義過濾器。請參閱http://codecorner.galanter.net/2012/03/06/replace-datatable-rowfilter-with-linq/ –

回答

2

您可以使用在RowFilter和CONCAT所有flters LIKEOR

var rowFilter = string.Format(
     "ID LIKE '%{0}%' OR TITLE LIKE '%{1}%' OR Company LIKE '%{2}%' OR UserName LIKE '%{3}%'" 
     , txtSearchID.Text 
     , txtSearchTitle.Text 
     , txtSearchCompany.Text 
     , txtSearchUserName.Text 
    ); 
gridToTable.DefaultView.RowFilter = rowFilter; 

DataColumn.Expression Property(相同的語法DataView.RowFilter

但說實話,我會建議使用LINQ-to-DataSet,而不是因爲它更強大。

例如:

DataTable tblFiltered = gridToTable.AsEnumerable() 
         .Where(r => r.Field<int>("ID").ToString().Contains(txtSearchID.Text) 
           || r.Field<string>("TITLE").Contains(txtSearchTitle.Text) 
           || r.Field<string>("Company").Contains(txtSearchCompany.Text) 
           || r.Field<string>("UserName").Contains(txtSearchUserName.Text)) 
         .CopyToDataTable(); 
+0

上的示例99%...它不喜歡帶有空格的「用戶名」列在裏面。不幸的是,這裏提到了很多重新命名的內容。有什麼建議麼? 'System.Data.dll中發生類型'System.Data.SyntaxErrorException'的第一次機會異常 語法錯誤:'name'操作符後缺少操作數。 – ikathegreat

+0

@ikathegreat:然後您需要用括號括起來:'' [用戶名]'。 –

+0

絕對真棒。像我想要的那樣工作。謝謝。 – ikathegreat

-1

網格提供數據過濾三種互補的方法。 Row.Filtered - 顯示或隱藏數據的最簡單方法。但是,它不支持偶數驅動的數據模型,因此它對於更復雜的應用程序沒有用處。使用這種方法,程序員必須手動控制行可見性,並考慮可以對數據進行排序或分組,並且可以具有複雜的層次結構。

IFilter接口 - 最高效和方便的過濾方法。程序員必須繼承IFilter接口並實現IsFiltered方法。此方法使用行作爲參數,網格確定是否需要過濾。

列中的圖形過濾器。此功能使程序員能夠實現任何可用於交互式數據過濾的圖形過濾器。任何放置在下拉框中的圖形控件都可以用作過濾器。這種過濾器的實現基於熟悉的UITypeEditor,它可以爲任何用戶控件提供更多可以訪問dapfor的詳細信息。 com