2017-10-19 55 views
-1

我使用的datagridview绑定到数据表中显示我的记录,我有这样的(只是举例)记录
名称国家
过滤器的datagridview使用数据视图

JAck  Country1 City1 
Name2 Country1 City2 
JACK  Country2 City1 
多个关键字

我有文本框搜索我不想使用这个文本框在这个datagridview中搜索多个关键字 我想例如得到Country1的所有记录,并有名字插孔 我把一个字符串文本框这样
[JACK国家1]
我创建这个方法基于任何列

string query = ""; 
     Boolean firsttime = true; 
     bool firstkeyword = true; 
     foreach (string se in txt_ar_recherche.Text.Trim().Split(' ')) 
     { 
      string search = (Convert.ToString(" like '%") + se) + "%'"; 
      if(!firstkeyword) query += " and "; 

      query += "("; 
      bool firstcolumn = true; 

      foreach (DataGridViewColumn col in grid.Columns) 
      { 
       if (col.Visible) 
       { 
        if (firsttime) 
        { 
         query += "Convert(" + col.Name + ",'System.String')" + search; 
         firsttime = false; 
        } 
        else 
        { 
         query += " or " + "Convert(" + col.Name + ",'System.String')" + search; 
        } 
       } 
       firstcolumn = false; 
      } 
      firstkeyword = false; 
      query += ")"; 

     } 
     (grid.DataSource as DataTable).DefaultView.RowFilter = query; 

创建动态的RowFilter查询,但它不工作,我不知道如何解决这个问题在datagridview的 我wan't创建的部份相同的文本框搜索该数据表使用JavaScript mutilple关键字搜索,这是一个演示https://datatables.net/

+0

如何生成查询看起来像?什么不行?崩溃的应用程序?在某些列上进行错误的过滤? – Reniuz

+0

做了一些测试,如果你看看你的查询..你会发现一个不相关的'或'可能会导致问题 – Reniuz

+0

但没有或查询这样的loke(名称像'%JACK%'或国家像'%JACK%'或像'%JACK%'这样的城市)和(像'%country1%'这样的名字或像'%country1%'这样的国家或像'%country1%'这样的城市)它不起作用 –

回答

1

试试这个全样本:

using System; 
using System.Data; 
using System.Linq; 
using System.Windows.Forms; 

namespace WindowsFormsApp1 
{ 
    public partial class Form1 : Form 
    { 
     DataGridView dataGridView; 
     DataTable dataTable; 
     DataView dataView; 
     TextBox textBoxSearch; 

     public Form1() 
     { 
      //InitializeComponent(); 

      Width = 800; 
      dataGridView = new DataGridView { Parent = this, Dock = DockStyle.Top }; 
      textBoxSearch = new TextBox { Parent = this, Top = 200 }; 
      textBoxSearch.TextChanged += TextBoxSearch_TextChanged; 

      dataTable = new DataTable(); 

      dataTable.Columns.Add("Name"); 
      dataTable.Columns.Add("Country"); 
      dataTable.Columns.Add("City"); 

      dataTable.Rows.Add("JAck", "Country1", "City1"); 
      dataTable.Rows.Add("Name2", "Country1", "City2"); 
      dataTable.Rows.Add("JACK", "Country2", "City1"); 

      dataView = new DataView(dataTable); 
      dataGridView.DataSource = dataView; 
     } 

     private void TextBoxSearch_TextChanged(object sender, EventArgs e) 
     { 
      var words = textBoxSearch.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

      if (!words.Any()) 
      { 
       dataGridView.DataSource = dataView; 
       return; 
      } 

      var dv = dataView; 

      foreach (var word in words) 
      { 
       var values = dataTable.Columns 
        .OfType<DataColumn>() 
        .Select(c => "Convert([" + c.ColumnName + "], System.String)") 
        .Select(c => c + " like '%" + word + "%'"); 

       var filter = string.Join(" or ", values); 
       dv = new DataView(dv.ToTable()); 
       dv.RowFilter = filter; 
       dataGridView.DataSource = dv; 
      } 
     } 
    } 
} 
+0

非常感谢你 –