【问题标题】:refreshing bound datagridview with filter after update c#更新后用过滤器刷新绑定的datagridview c#
【发布时间】:2012-05-15 13:00:16
【问题描述】:

我有一个带有过滤器的 datagridview 用于搜索。如果我更新数据库然后将 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();                
}

通过修改一个或多个绑定控件对 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 的内容产生任何影响。

【问题讨论】:

  • 请先发布您的代码,以便我们清楚地了解您的问题。什么是过滤器?
  • vwTILEAdminBindingSource.Filter = string.Format(@"PdcProductName LIKE '%{0}%' OR LabelDescription LIKE '%{0}%' OR LabelProductName LIKE '%{0}%'", tb .Text.Trim().Replace("'", "''")); dataGridView1.Refresh();
  • 当然。 vwTILEAdminBindingSource.Filter = string.Format(@"PdcProductName LIKE '%{0}%' OR LabelDescription '%{0}%' OR LabelProductName LIKE '%{0}%'", tb.Text.Trim().Replace( "'", "''")); dataGridView1.Refresh();然后在更新代码中我尝试再次调用 Refresh。然后,如果我再次设置网格的数据源,文本框的搜索功能就消失了。谢谢。
  • 请用您当前的代码更新您的问题,并包括一些关于您拥有什么样的数据源(数据表?)以及您当前如何更新它的详细信息。执行此操作的标准方法是将数据源设为空,然后再次设置它 - 当您说“文本框的搜索功能消失”时,您的意思并不清楚
  • 我已经设法通过在添加行时创建一个新的 DataTable 来重现类似的行为(我没有使用表适配器,所以只需手动模拟更新)。不确定这是否真的重复了你的问题。您能否将您的完整代码发布在后面,而不仅仅是过滤器和更新方法。我认为问题一定是您正在过滤不再是您的数据源的表,但需要查看您在哪里实例化所有内容以确保。我认为可疑的行是 DataTable dt = new DataTable();我希望您改为使用 dt 的类级别变量。

标签: c# datagridview filter refresh


【解决方案1】:

看起来你的问题很简单。

在这些行中:

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 调用应该足够了。

【讨论】:

  • 在我关闭表单并重新打开之前仍然看不到更改,所以我知道数据库正在更新。我尝试清空数据源并重置它,但没有影响。行 dataGridView1.DataSource = typeof(List);无法编译:错误 1 ​​使用泛型类型 'System.Collections.Generic.List' 需要 1 个类型参数。再次感谢@David 的所有帮助。
  • @Gary 是的,我只是试图复制您的错误,发现对我来说过滤仍然有效,而我预计它会被破坏。继续挖掘,看看我是否能找出对你来说有什么不同。
  • 过滤器继续工作,但更新的内容在我重新打开表单之前不存在。
  • vwTILEAdminBindingSource.DataSource = tILEDataSet.vwTILEAdmin; dataGridView1.DataSource = vwTILEAdminBindingSource; vwTILEAdminBindingSource.ResetBindings(true);我错过了什么?
  • @Gary 听起来您已经稍微更改了代码。您能否使用完整的 winforms 代码编辑您的问题,该代码显示了复制问题的最小可能代码。我当前的机器上没有 sql server,所以需要查看所有代码才能弄清楚发生了什么。也就是说,在重新分配绑定源之前,您是否尝试在注释中将 gridview 的数据源设置为?
猜你喜欢
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2011-07-28
相关资源
最近更新 更多