2011-03-30 13 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