2016-09-22 8 views
0

Пожалуйста, я хотел бы фильтровать представление сетки на основе каждого слова текстового поля. где фильтр должен искать сетку данных каждый раз, когда я добавляю слово последовательно. Но в коде ниже он заканчивает возврат поиска только в зависимости от последнего слова. Обратите внимание, что я использую представление сетки данных.Фильтр DataGridView через текстовое поле C# с каждым словом в качестве фильтра

Любой Консультировать

частная пустота textBox1_TextChanged (объект отправителя, EventArgs е) {

 int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count(); 
     label68.Text = count.ToString(); 
     string[] nameParts = textBox1.Text.Split(' '); 
     int cnlp = 1; 

     while (cnlp <= count) 
     { 
      string loopcount = nameParts[(cnlp - 1)]; 
      lbtest5.Text = loopcount.ToString(); 
      var bd = (BindingSource)dgvShopDrawings.DataSource; 
      var dt = (DataTable)bd.DataSource; 
      dt.DefaultView.RowFilter = string.Format("DrawingID like '%{0}%' or title like '%{0}%' or level like '%{0}%'", lbtest5.Text.Replace("'", "''")); 
      dgvShopDrawings.Refresh(); 
      ShopDrawingRecordCount = dt.Rows.Count; 
      SdDgvStatusCount.Text = String.Format("Records In {0}/{1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount); 
      cnlp = cnlp + 1; 
     } 

    } 

ответ

0

Вы заменяете свой RowFilter каждой итерацией, поэтому в курсе это показывает только последний.

Попробуйте что-нибудь подобное вместо этого:

 int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count(); 
     label68.Text = count.ToString(); 
     string[] nameParts = textBox1.Text.Split(' '); 
     int cnlp = 1; 

     string rowfilter = ""; 
     while (cnlp <= count) 
     { 
      string loopcount = nameParts[(cnlp - 1)]; 
      lbtest5.Text = loopcount.ToString(); 
      if (rowfilter.Length > 0) rowfilter += " AND "; 
      rowfilter += tring.Format("(DrawingID like '%{0}%' or title like '%{0}%' or level like '%{0}%')", lbtest5.Text.Replace("'", "''")); 
      cnlp = cnlp + 1; 
     } 

     var bd = (BindingSource)dgvShopDrawings.DataSource; 
     var dt = (DataTable)bd.DataSource; 
     dt.DefaultView.RowFilter = rowfilter; 
     dgvShopDrawings.Refresh(); 
     ShopDrawingRecordCount = dt.Rows.Count; 
     SdDgvStatusCount.Text = String.Format("Records In {0}/{1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount); 
+0

. Поиск должен выглядеть следующим образом: textBox1: john class 900 , поэтому я хочу, чтобы сетка отображала фильтр для строки, имеющей (john и класс и 90) –

+0

@FirasS, тогда вместо этого вы должны использовать оператор« и » оператора "или" в строке: if (rowfilter.Length> 0) rowfilter + = "OR"; и заключить в строку string.Format (.. текст фильтра здесь ..) в фигурных скобках – Arie

+0

Я уже изменил или, но без эффекта –

0

RowFilter возвращает последний использованный фильтр, поэтому вы получаете применявшимся фильтр (последнее слово в текстовом поле). Используйте in condtion для RowFilter вместо =. create in условие совместимой строки в цикле и применить его к datatable вне цикла.

попробуйте изменить код соответствующим образом. Я изменил код с in. может быть некоторая ошибка компиляции, поскольку я не скомпилировал.

string RowFilter=""; 
     int count = textBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count(); 
     label68.Text = count.ToString(); 
     string[] nameParts = textBox1.Text.Split(' '); 
     int cnlp = 0; 
      while (cnlp < nameParts.Count()) 
     { 
      string loopcount =nameParts[cnlp]; 

      RowFilter+="'" + loopcount + "',"; 


      cnlp = cnlp + 1; 
     } 

      if (RowFilter != "") 
       RowFilter = RowFilter.Substring(0, RowFilter.Length - 1); 

      var bd = (BindingSource)dgvShopDrawings.DataSource; 
      var dt = (DataTable)bd.DataSource; 
      dt.DefaultView.RowFilter = string.Format("DrawingID in ({0}) or title in ({0}) or level in ({0})", RowFilter); 
      dgvShopDrawings.Refresh(); 
      int ShopDrawingRecordCount = dt.Rows.Count; 
      SdDgvStatusCount.Text = String.Format("Records In {0}/{1} ", dgvShopDrawings.Rows.Count, ShopDrawingRecordCount); 
+0

Я новичок в C#, пожалуйста, вы можете объяснить больше –

+0

Sorry Bro, но он сделал фильтр в качестве критериев. может быть, я не объяснил, пожалуйста, см. ниже: Поиск должен выглядеть следующим образом textBox1: john class 900, поэтому я хочу, чтобы сетка отображала фильтр для строки, имеющей (john и class и 90) –

+0

Значения поиска могут быть в любые столбцы (DrawingID, название, уровень) в строке? Пожалуйста, добавьте скриншоты, если это возможно. –

 Смежные вопросы

  • Нет связанных вопросов^_^