我有一个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);
}
如果我取消注释我设置DataSource的行,我会得到一个刷新的视图,但用于在绑定源上生成过滤器的文本框不再有效,例如无论我在文本框中键入什么。仍然会调用Text_Changed事件,但过滤器不再对dgv的内容产生任何影响。
答案 0 :(得分:2)
看起来你的问题非常简单。
在这些方面:
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
调用应该足够了。