2017-06-16 26 views
0

我想通过使用DefaultView.RowFilter过滤我的Datagridview,并且当前可以轻松地通过单个单词对列表进行排序。我的问题是如何通过多个词来过滤它。下面是一个例子通过多个键或单词过滤DataGridView

我的datagridview将包括:

1托皮卡

2曼哈顿

3达拉斯

4达拉斯

5托皮卡

6威奇托

那么我会在文本框中键入“威奇托,达拉斯,曼哈顿”或“威奇托,达拉斯,曼哈顿”,然后将过滤我的DataGrid中,只显示

2曼哈顿

3达拉斯

4达拉斯

6威奇托

这里是我的代码。它不喜欢在'%{s}%'处有一个数组值,但它适用于FilterTextBox.Text为“Dallas”或甚至“Dall”的单个过滤器,例如'%{FilterTextBox.Text}%' 。

private void FilterTxtbox_TextChanged(object sender, EventArgs e) 
{ 
    if (uxFilterTxtbox.Text != "Type Here...") //IGNORE... This is for my watermark capibility 
    { 
     string[] s = uxFilterTxtbox.Text.Split(','); 

     (uxWiuInfoGrid.DataSource as DataTable).DefaultView.RowFilter = 
        $"WiuAddressCol + SubDivLongNameCol + StationNameCol + LineSegCol + MilepostCol + MilepostSuffixCol LIKE '%{s}%'"; 
    } 
} 
+1

行过滤器使用类似SQL的语法。你将不得不把每个条件放在一起。 – Crowcoder

+0

谢谢我在下面发布了一个快速解决方案。如果有更好的方法,请让我知道。 – JustCoding

回答

0

可能不是最好的方法,但这确实是需要的。只要您用','分隔它们,就会尽可能多地使用过滤器。单词之间可以有空格,因为我在每个分割上使用了Trim(),所以甚至可以在逗号之前或之后放置空格。

private void FilterTxtbox_TextChanged(object sender, EventArgs e) 
{ 
    string allColumns = "WiuAddressCol + SubDivLongNameCol + StationNameCol + LineSegCol + MilepostCol + MilepostSuffixCol"; 

    if (uxFilterTxtbox.Text != "Type Here...") 
    { 
     string[] split = uxFilterTxtbox.Text.Split(','); 

     var mainSearchString = allColumns + " LIKE '%"+ split[0]?.Trim()+ "%'"; 

     if (split.Length > 1) 
     { 
      for (int i = 1; i < split.Length; i++) 
      { 
       mainSearchString += " OR "+ allColumns + " LIKE '%" + split[i]?.Trim() + "%'"; 
      } 
      (uxWiuInfoGrid.DataSource as DataTable).DefaultView.RowFilter = mainSearchString; 
     } 
     else 
     { 
      (uxWiuInfoGrid.DataSource as DataTable).DefaultView.RowFilter = mainSearchString; 
     } 

    } 
}