2

検索を行うためのフィルターを備えたデータグリッドビューがあります。データベースを更新してから dgv をデータソースにリセットすると、フィルターが失われます。ResetBindings を実行しようとしましたが、役に立ちませんでした。フォームを閉じて再度開くと、変更が「リアルタイム」で行われるようにしたいと思います。アドバイスをいただければ幸いです。

SQL ビューに基づくデータセットがあります。このデータセットには、このビューに基づくテーブルがあります。datagridview はこのテーブルにバインドされています。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();                
}

1 つまたは複数のバインドされたコントロールを変更して dgv の行に変更を加えた後、変更を保存すると、テーブルが更新されます。

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 の内容に影響しなくなります。

4

1 に答える 1

2

あなたの問題は非常に単純なもののようです。

これらの行で:

dataGridView1.DataSource = tILEDataSet.vwTILEAdmin; 

this.vwTILEAdminBindingSource.ResetBindings(true);

グリッドのデータ ソースを vwTILEAdmin に設定しましたが、フィルター コードでは、グリッドのデータ ソースではなくなったバインディング ソースをフィルター処理しています。

代わりに試してください:

this.vwTILEAdminBindingSource.DataSource = tILEDataSet.vwTILEAdmin; 

this.vwTILEAdminBindingSource.ResetBindings(true);

また、おそらくグリッドでの呼び出しは必要ありませ.Refresh()ん。このメソッドは実際にはグリッドのデータ ソースを更新しません。グリッド クライアント領域を再描画するだけで、古いデータ ソース (データが変更されたことをグリッドが認識していない) がある場合、再描画は違いを生みません。

それでも問題が解決しない場合は、グリッド データ ソースへの更新が反映されていない可能性がありますListChanged。これは、更新時期を知るためにグリッドがリッスンするイベントを発生させていない可能性があります。その場合は、データ ソースを null にしてリセットする必要があります。

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

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

于 2012-05-07T12:44:26.077 に答える