2012-05-06 14 views
2

検索を行うためのフィルタを備えたdatagridviewがあります。データベースを更新してからdgvをデータソースにリセットすると、フィルタが失われます。私はResetBindingsをやってみたが、それは役に立たなかった。フォームを閉じて変更を再開すると、「リアルタイム」で発生するようにしたいと思います。アドバイスをいただければ幸いです。更新後にフィルタを使用してバインドされたdatagridviewを更新するC#

私はSQLビューに基づいてデータセットを持っています。このデータセットには、このビューに基づくテーブルがあります。このテーブルには、datagridviewがバインドされています。私はテキストボックスとdgvの列にバインドされているコンボボックスを含むいくつかのコントロールを持っています。 1つまたは複数のI変更を保存バインドコントロールの、更新テーブルを変更することによってDGVの行に変更を行った後

private void txtFilterString_TextChanged(object sender, EventArgs e) 
{ 
    ToolStripTextBox tb = (ToolStripTextBox)sender; 

    DataView dv = tILEDataSet.vwTILEAdmin.DefaultView; 

    vwTILEAdminBindingSource.Filter = 
     string.Format(@"PdcProductName LIKE '%{0}%' OR LabelDescription LIKE '%{0}%' OR LabelProductName LIKE '%{0}%'", 
     tb.Text.Trim().Replace("'", "''")); 

    dataGridView1.Refresh();     
} 

:私は、グリッドを検索するために使用されるテキストボックスを有する

sql.Append(@"UPDATE [dbo].[LabeledProducts] 
SET [PdcProductName] = @pdcProd 
,[LabelProductName] = @lblProd 
,[LabelDescription] = @lblDesc 
,[Power] = @pwr 
,[Fabrication] = 0 
,[UL_File_Number] = '' 
,[PrePrintedSerial] = 0 
,[ShowOrderOnLabel] = 0 
,[PrivateLabelLogoId] = @plid 
,[AgencyImageId] = @aid 
,[WireDiagConfigId] = @wid 
WHERE PdcProductName = '").Append(pdcProductName).Append("'"); 

using (SqlCommand command = new SqlCommand(sql.ToString(), printConfigTableAdapter.Connection)) 
{ 
    if (vwTILEAdminTableAdapter.Connection.State != ConnectionState.Open) 
     vwTILEAdminTableAdapter.Connection.Open(); 

    LabeledProductsDataTableAdapter.UpdateCommand = command; 
    LabeledProductsDataTableAdapter.UpdateCommand.Parameters.AddWithValue("@pdcProd", txtPdcProdName.Text); 
    LabeledProductsDataTableAdapter.UpdateCommand.Parameters.AddWithValue("@lblProd", txtLabeledProd.Text); 
    LabeledProductsDataTableAdapter.UpdateCommand.Parameters.AddWithValue("@lblDesc", txtLabelDesc.Text); 
    LabeledProductsDataTableAdapter.UpdateCommand.Parameters.AddWithValue("@pwr", txtPower.Text); 
    // we need ulfilename and mod 
    LabeledProductsDataTableAdapter.UpdateCommand.Parameters.AddWithValue("@plid", LogoId); 
    LabeledProductsDataTableAdapter.UpdateCommand.Parameters.AddWithValue("@aid", AgencyId); 
    LabeledProductsDataTableAdapter.UpdateCommand.Parameters.AddWithValue("@wid", WireId); 
    DataTable dt = new DataTable(); 

    int rowsAffected = LabeledProductsDataTableAdapter.Update(dt); 
    rowsAffected = command.ExecuteNonQuery(); 

    dataGridView1.Refresh(); 
    //dataGridView1.DataSource = tILEDataSet.vwTILEAdmin; 

    //this.vwTILEAdminBindingSource.ResetBindings(true); 

} 

DataSourceを設定した行のコメントを外すと、更新されたビューが表示されますが、バインディング元のフィルタを生成するために使用されたテキストボックスは機能しなくなりました。私はテキストボックスに何を入力するかにかかわらず。 Text_Changedイベントは呼び出されますが、フィルターはdgvの内容に影響を与えません。

+0

問題をはっきりと理解できるように、まずコードを記入してください。フィルタとは何ですか? – jams

+0

あなたのコードを投稿することができます。 – BizApps

+0

vwTILEAdminBindingSource.Filter = \t \t \t \t String.Formatの(@ "PdcProductName LIKE '%{0}%' OR LabelDescription LIKE '%{0}%' OR LabelProductName LIKE '%{0}%'"、 \t \t \t \t tb.Text.Trim()。Replace( "'"、 "' '")); \t \t \t dataGridView1。リフレッシュ(); – Gary

答えて

2

あなたの問題はとてもシンプルなようです。これらの行で

​​

あなたがvwTILEAdminするグリッドのデータソースを設定するが、あなたのフィルタコードで、あなたは、もはやグリッドのデータソースでバインディングソースをフィルタリングしています!

ではなく、試してみてください。

this.vwTILEAdminBindingSource.DataSource = tILEDataSet.vwTILEAdmin; 

this.vwTILEAdminBindingSource.ResetBindings(true); 

をまた、あなたはおそらく、グリッド上.Refresh()呼び出しを必要としない - の方法は、実際には、グリッドのデータソースを更新しません。グリッドクライアント領域のみが再描画され、古いデータソース(グリッドでデータが変更されていないことがわかっていない場合)がある場合、再描画によって差は生じません。

グリッドデータソースの更新が伝播していない可能性があります。グリッドが更新するタイミングを知るために聴いているListChangedイベントが発生していない可能性があります。その場合、データソースをnullにしてリセットする必要があります。データソース上記のコードで

dataGridView1.DataSource = typeof(List<string>); 
dataGridView1.DataSource = newDataSource; 

これは、既存の列を保持するためtypeof(List)に設定されています。次に、バインディングソースをグリッドデータソースに再度設定します。これが必要になるのではないかとは思っていますが、バインディングソースResetBindingsコールで十分です。

+0

フォームを閉じて再度開くまで、変更が表示されないので、データベースが更新されています。私はデータソースを無効にしてリセットしましたが、影響はありませんでした。行dataGridView1.DataSource = typeof(リスト);コンパイルされません:ジェネリック型「System.Collections.Generic.List 」を使用したエラー 1型の引数​​が必要です。あなたのすべての助け@Davidにもう一度感謝します。 – Gary

+0

@Garyはい、私はちょうどあなたのエラーを複製しようとしたと私はそれが壊れて期待したときにフィルタリングはまだ動作することがわかった。私があなたのために違うものを見つけ出すことができるかどうかを掘り起こし続けるつもりです。 –

+0

フィルタは引き続き動作しますが、フォームを再度開くまで、更新されたコンテンツは表示されません。 – Gary

関連する問題