【发布时间】: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