更新 C# 后使用筛选器刷新绑定的数据网格视图

本文关键字:绑定 数据 数据网 视图 网格 刷新 筛选 更新 | 更新日期: 2023-09-27 18:33:31

>我有一个带有用于搜索的过滤器的数据网格视图。如果我更新数据库,然后将 dgv 重置为数据源,则会丢失过滤器。我尝试进行重置绑定,但这没有帮助。如果我关闭表单并重新打开更改,我只是希望它"实时"发生。任何建议不胜感激。

我有一个基于 SQL 视图的数据集。在此数据集中,有一个基于此视图的表。数据网格视图绑定到此表。我有几个控件,包括绑定到 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();                
}

通过修改一个或多个绑定控件对 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);
}

如果我取消注释设置数据源的行,我会得到一个刷新的视图,但用于在绑定源上生成过滤器的文本框不再起作用,例如,无论我在文本框中键入什么。仍会调用 Text_Changed 事件,但过滤器不再对 dgv 的内容产生任何影响。

更新 C# 后使用筛选器刷新绑定的数据网格视图

看起来你的问题很简单。

在这些行中:

dataGridView1.DataSource = tILEDataSet.vwTILEAdmin; 
this.vwTILEAdminBindingSource.ResetBindings(true);

您将网格的数据源设置为 vwTILEAdmin,但在过滤器代码中,您正在筛选不再是网格数据源的绑定源!

请尝试:

this.vwTILEAdminBindingSource.DataSource = tILEDataSet.vwTILEAdmin; 
this.vwTILEAdminBindingSource.ResetBindings(true);

此外,您可能不需要网格上的.Refresh()调用 - 该方法实际上不会刷新网格的数据源。它仅重绘网格工作区,如果您有一个过时的数据源(网格不知道数据已更改(,则重绘不会产生影响。

如果仍然遇到问题,则可能是对网格数据源的更新未传播 - 这不会引发网格侦听以了解何时更新的ListChanged事件。如果是这种情况,则需要为数据源清空并重置它。

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

在上面的代码中,数据源设置为 typeof(List),因为这会保留任何现有列。然后,再次将绑定源设置为网格数据源。虽然我怀疑这是必要的 - ResetBindings调用的绑定源应该足够了。