2011-03-30 51 views
1

我知道如何基於來自單個文本框的用戶輸入來過濾數據過濾數據視圖:如何基於多個輸入

FilterDataView.RowFilter = txtFilter.Text;

但是,你將如何去基於來自多個領域的多個用戶輸入過濾數據。 基本上,過濾器將充當「搜索」功能。

+0

你的意思是,例如可以輸入一個關鍵詞,選擇從下拉列表的選項,然後選擇一個日期範圍內的用戶? – 2011-03-30 16:50:00

+0

沒有,有4個文本框,如果用戶全部填寫並按下過濾器,他會找到一個特定的記錄,但是如果他只輸入1個文本框,他將獲得更多結果。例如,如果他輸入fname,lname,城市,職業他會找到一個人,但是如果用戶只進入城市,那麼用戶只能獲得其人員住在該城市的記錄。 – HelloWorld 2011-03-30 16:55:18

+0

是否將數據視圖綁定到可以應用連續Where子句的查詢?在Linq這很容易。如果這對你有用,請告訴我,我可以提供一個例子。 – nycdan 2011-03-30 16:57:51

回答

5

定義RowFilter時,您可以使用像t-sql這樣的東西。

一個想法是:

FilterDataView.RowFilter = "name like '%habjan%' and city like '%new york%'" 

在這裏你可以找到有關的RowFilter語法的好文章:DataView RowFilter Syntax

對於你需要什麼,你將不得不建立基於輸入的字段行篩選。

StringBuilder sb = new StringBuilder(); 

    if (tb1.Text.Length > 0) 
    { 
     sb.Append("name like '%" + tb1.Text + "%'"); 
    } 

    if (tb2.Text.Length > 0) 
    { 
     if(sb.Length > 0) 
     { 
      sb.Append(" and "); 
     } 

     sb.Append("city like '%" + tb2.Text + "%'"); 
    } 
    //.... and so on... 

    FilterDataView.RowFilter = sb.ToString(); 
+0

有趣的,但有幾個語法錯誤。第二個%左邊有錯誤的引號。另外當我這個方法的程序給了我一個錯誤指向FilterDataView.RowFilter = sb.ToString();說tb1.text列找不到。但它不是一個文本框? – HelloWorld 2011-03-30 17:24:32

+0

@HelloWorld:對不起,我沒有使用代碼編輯器來編寫這段代碼,我直接在這裏寫了。 – HABJAN 2011-03-30 17:42:58

+0

@HelloWorld:我修正了報價問題。 – HABJAN 2011-03-30 17:43:53

0

好的,Linq to SQL將成爲你的朋友。

你需要學習語法,並有幾個不同的形式,但你可以重新以這種方式查詢:

var x = from T in db.Table 
     where [usual where stuff goes here]; 

然後,您可以測試每個文本框,請執行以下操作:

if (TextBox1.Text != null) x.Where(w => w.field1 == val1); 

好的是,你可以一次層疊一個Where子句。然後將你的對象綁定到var。

[objectname].Datasource = x; 
[objectname].Databind(); 

這應該可以解決您的問題。

+0

好吧我試着讓它工作。它會刷新DataGridView嗎? – HelloWorld 2011-03-30 17:11:49

+0

不確定你是否仍然想這樣做,但值得嘗試靈活性。是的,當你做.Databind()時,它會刷新datagridview。 – nycdan 2011-03-30 19:50:43