C# 更新c后使用筛选器刷新绑定的datagridview#

C# 更新c后使用筛选器刷新绑定的datagridview#,c#,datagridview,filter,refresh,C#,Datagridview,Filter,Refresh,我有一个datagridview,带有一个用于执行搜索的过滤器。如果我更新数据库,然后将dgv重置为数据源,我将丢失过滤器。我试着重新设置绑定,但是没有用。如果我关闭表单并重新打开表单中的更改,我只希望它“实时”发生。任何建议都将不胜感激 我有一个基于SQL视图的数据集。在此数据集中有一个基于此视图的表。datagridview已绑定到此表。我有几个控件,包括绑定到dgv中的列的文本框和组合框。我有一个用于在网格上搜索的文本框: private void txtFilterString_Text

我有一个datagridview,带有一个用于执行搜索的过滤器。如果我更新数据库,然后将dgv重置为数据源,我将丢失过滤器。我试着重新设置绑定,但是没有用。如果我关闭表单并重新打开表单中的更改,我只希望它“实时”发生。任何建议都将不胜感激

我有一个基于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();                
}
通过修改一个或多个绑定控件对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的内容有任何影响

看来你的问题很简单

在这些方面:

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; 
dataGridView1.DataSource=typeof(列表);
dataGridView1.DataSource=newDataSource;

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

请先发布您的代码,以便我们能够清楚地了解您的问题。什么是filter?vwTILEAdminBindingSource.filter=string.Format(@“类似于“{0}%”的PdcProductName或类似于“{0}%”的LabelDescription或类似于“{0}%”的LabelProductName,tb.Text.Trim().Replace(“,”);dataGridView1.Refresh();当然vwTILEAdminBindingSource.Filter=string.Format(@“类似于“{0}%”的PdcProductName或类似于“{0}%”的LabelDescription“{0}%”的LabelProductName或类似于“{0}%”的LabelProductName”,tb.Text.Trim().Replace(“,”);dataGridView1.Refresh();然后在更新代码中,我再次尝试调用刷新。然后,如果我再次设置网格的数据源,文本框的搜索功能就会消失。谢谢。请用您当前的代码更新您的问题,并包括有关您拥有的数据源类型(datatable?)以及当前如何更新的一些详细信息。执行此操作的标准方法是将数据源设置为空,然后再次设置它-不清楚您所说的“文本框的搜索功能消失”是什么意思。我在添加行时创建了一个新的DataTable(我没有使用表适配器,所以只需手动模拟更新),从而成功地再现了类似的行为。但不确定这是否真的会重复你的问题。你能不能把你的全部代码放在后面,而不仅仅是过滤器和更新方法。我认为问题一定是您正在筛选一个不再是数据源的表,但需要查看在哪里实例化所有内容才能确定。我认为可疑的行是DataTable dt=newdatatable();我希望您为dt使用一个类级变量。在我关闭表单并重新打开之前,仍然看不到更改,因此我知道数据库正在更新。我尝试将数据源置零并重置它,以使其不受影响。行dataGridView1.DataSource=typeof(List);未编译:错误1使用泛型类型“System.Collections.generic.List”需要1个类型参数。再次感谢您对@David的帮助。@Gary是的,我只是试图复制您的错误,发现在我预料到过滤会被破坏时,它对我仍然有效。我会继续挖掘,看看是否能找出与您不同的地方。过滤器会继续工作,但更新的内容不会出现,直到我重新打开表单。vwTILEAdminBindingSource.DataSource=tILEDataSet.vwTILEAdmin;dataGridView1.DataSource=VWTiledMinBindingSource;vwTILEAdminBindingSource.ResetBindings(true);我遗漏了什么?@Gary听起来你对代码做了一点修改。请用完整的winforms代码编辑您的问题,该代码显示了复制问题的最小可能代码。我当前的机器上没有sql server,因此需要查看所有代码以了解发生了什么。也就是说,在重新分配绑定源之前,您是否尝试在注释中编写代码,将gridview的数据源设置为?