2016-09-22 10 views
0

テキストボックスの各単語に基づいてグリッドビューをフィルタリングしたかったのですか?連続して単語を追加するたびにフィルタがデータグリッドを検索する必要があります。しかし、下のコードでは、最後の単語に応じてのみ検索を戻します。私はデータグリッドビューを使用していることに注意してください。あなたが最後になっている理由ですDataGridViewをC#のテキストボックスで各単語をフィルタとしてフィルタ

どれアドバイス

ます。private void 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とclassと90)を持つ行をフィルタリングしたい場合は –

+0

@FirasS代わりに" and "演算子を使うべきですof "または" operator in line:if(rowfilter.Length> 0)rowfilter + = "OR"; string.Format(.. filter text here ..)を中括弧で囲みます – Arie

+0

私はすでにまたはを変更しましたが、効果はありません –

0

RowFilter戻り、最新の適用されるフィルタは、フィルタ(テキストボックス内の最後の単語)を適用しました。 =の代わりにRowFilterinを使用してください。ループ内にin条件互換性のある文字列を作成し、それをループ外のデータテーブルに適用します。

これに応じてコードを変更してください。投稿コードを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

申し訳ブロを説明するが、それは基準としてフィルタをやったことができます。私はよく説明していない可能性があります、下記を参照してください: 検索は、以下のようにする必要がありますtextBox1:johnクラス900ので、(johnとクラスと90)を持つ行のフィルタを適用するグリッドビュー –

+0

列(DrawingID、タイトル、レベル)は連続していますか?可能であればスクリーンショットを追加してください。 –

関連する問題