2017-10-19 20 views
-1

J'utilise datagridview lier à datatable pour montrer mes dossiers et j'avoir des dossiers comme celui-ci (par exemple seulement)
NomPaysVille
datagridview filtre avec plusieurs mots-clés à l'aide dataview

JAck  Country1 City1 
Name2 Country1 City2 
JACK  Country2 City1 

J'ai textbox pour la recherche que je ne voudrais pas utiliser cette zone de texte pour rechercher dans ce datagridview avec plusieurs mots-clés je ne veux pas par exemple obtenir tous les enregistrements pour Country1 et avoir le nom jack i mettre une chaîne en zone de texte comme celui-ci
[JACK pays1]
i créer cette méthode pour créer la requête RowFilter dynamique basée sur les colonnes

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; 

mais il ne fonctionne pas, je ne sais pas comment résoudre ce problème recherche avec les mots-clés dans mutilple datagridview i wan't pour créer ths même recherche textBox DATATABLE JavaScript, ceci est une démonstration https://datatables.net/

+0

A quoi ressemble la requête générée? Et qu'est-ce qui ne marche pas? Crashing application? Filtrage incorrect sur certaines colonnes ou quelque chose? – Reniuz

+0

Est-ce que certains test et si vous regardez votre requête ... vous trouverez un 'ou' non pertinent qui peut causer – Reniuz

+0

Mais sans ou requête loke comme ceci (nom comme '% JACK%' ou pays comme '% JACK%' ou ville comme '% JACK%') et (nom comme '% country1%' ou pays comme '% country1%' ou ville comme '% country1%') ça ne marche pas –

Répondre

1

Essayez ce échantillon complet:

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

merci beaucoup –