2017-07-20 8 views
0

私はdatagridviewとテキストボックスを持っています。ユーザーがテキストボックスに文字を入力すると、datagridviewを並べ替えて、結果をテキストボックスのテキストとして表示します。しかし、ユーザーがテキストボックスに何も入力しなかったり、テキストボックスにあるものを消さなかったりすると、データベースのすべての結果を表示するようにdatagridviewを設定します。実際、私は2週間前に成功しましたが、私はいくつかの変更を加えましたが、もう動作しません。ここでRefresh Datagridview、テキストボックスに挿入するときの詳細行

が私のコードです:

private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     SqlConnection maConnexion = new SqlConnection("Server= localhost; Database= Seica_Takaya;Integrated Security = SSPI; "); 
     maConnexion.Open(); 
     string Var1 = textBox1.Text; 
     SqlCommand command = maConnexion.CreateCommand(); 
     SqlCommand command1 = maConnexion.CreateCommand(); 

     if (Program.UserType == "admin") 
     { 
      if (textBox1.Text != String.Empty) 
      { 
       command.Parameters.AddWithValue("@SerialNum", Var1 + "%"); 
       command1.Parameters.AddWithValue("@SerialNum", Var1 + "%"); 
       command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference, FaultCodeByOp, RepairingTime FROM FailAndPass WHERE SerialNum LIKE @SerialNum AND FComponent IS NOT NULL"; 
       command1.CommandText = "SELECT Machine, BoardName, BoardNumber FROM FailAndPass WHERE SerialNum LIKE @SerialNum And FComponent IS NOT NULL"; 
      } 
     } 
     else 
     { 
      if (textBox1.Text != String.Empty) 
      { 
       command.Parameters.AddWithValue("@SerialNum", Var1 + "%"); 
       command1.Parameters.AddWithValue("@SerialNum", Var1 + "%"); 
       command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference, FaultCodeByOp, RepairingTime FROM FailAndPass WHERE (SerialNum LIKE @SerialNum) AND ReportingOperator IS NULL AND FComponent IS NOT NULL "; 
       command1.CommandText = "SELECT DISTINCT SerialNum, Machine, BoardName, BoardNumber FROM FailAndPass WHERE ReportingOperator IS NULL AND FComponent IS NOT NULL AND (SerialNum LIKE @SerialNum) "; 
      } 
     } 

     if (!string.IsNullOrWhiteSpace(textBox1.Text)) 
     { 
      SqlDataAdapter sda = new SqlDataAdapter(command); 
      SqlDataAdapter sda1 = new SqlDataAdapter(command1); 
      DataTable dt = new DataTable(); 
      DataTable dt1 = new DataTable(); 
      sda.Fill(dt); 
      sda1.Fill(dt1); 

      DataColumn dcIsDirty = new DataColumn("IsDirty", typeof(bool)); 
      DataColumn dcIsDirty1 = new DataColumn("IsDirty", typeof(bool)); 
      dcIsDirty.DefaultValue = false; 
      dcIsDirty1.DefaultValue = false; 
      dt.Columns.Add(dcIsDirty); 
      dt1.Columns.Add(dcIsDirty1); 

      dataGridView1.DataSource = dt; 
      dataGridView2.DataSource = dt1; 
      maConnexion.Close(); 

      dataGridView1.Columns[6].Visible = false; 
      dataGridView2.Columns[3].Visible = false; 

     } 
    } 

あなたが見るように、DataGridViewのは、ユーザーが列を編集し、そのボタンをクリックすることで、データベースに新しいデータを書き込むことができ、塗りつぶしです。しかし、ユーザーがテキストボックスにserialNumを書くと、結果は1つしか表示されず、例としてB0033から始まるすべての結果が表示されるわけではありません。

+0

[最小限で完全であり、かつ検証可能な例を作成する方法](https://stackoverflow.com/help/mcve)を投稿してください。私はあなたの質問には多くの不必要なコードがあると思います。 – Luke

+0

編集して変更します。 –

+0

私の編集を受け入れてください - 私はコメントされたコードも削除しました。あなたは何を正確に変更したのですか? – Luke

答えて

0

コメントに記載されているとおり、テキストが変更されるたびに再クエリーする必要はありません。私はあなたのためにいくつかのコードを書きました。アプリケーションのコードに変換する必要があります。

// Put this to the event or sub where you want to query for data 
Private DataGridView dgv; 
Private DataView _tblView; 
private void Form1_Load(object sender, EventArgs e) { 
     DataTable tbl = myModule.GetDataTableWithRows(); 
     // Imagine we have Columns "CutomerID", "CustomerLastName", "CustomerPriority" 
     _tblView = new DataView(tbl); 
     _tblView.RowFilter = ""; 
     dgv.DataSource = _tblView; 
    } 

してからTextChangedEvent

private void txtChanged(object sender, EventArgs e) { 
     _tblView.RowFilter = ("CustomerLastName like \'" + (mytextBox.Text + "\'")); 
    } 

アプリケーションでフィルタリングを行いますこの方法です。

rowfilterにもワイルドカードがありますが、どの文字も任意の文字に対しては%と思っています。詳細はDataView MSDN

+0

私はform_loadを使用している人を見てからしばらくしています。これは何ですか ?これは一種のコンストラクタですか? –

+0

私は以前は見たことがない例外があります:System.InvalidOperationException: 'ExecuteReader:適切なCommandTextが初期化されていません。どういう意味ですか? :/ –

+0

私はあなたのコードを私の中に入れて、変更を行った。私は間違いがなく、おそらく動作しません。そしてそれによって、私は "B0016"と書いても何もフィルタリングも何もしないということです。 –

関連する問題