单个datagridview行更新

时间:2012-06-22 15:29:10

标签: c# sql database datagridview

你能帮忙解决这个问题: 我有两种形式,datagridview和SQL数据库。 在我的第一个表单的加载事件中,我通过使用存储过程(选择查询)从我的SQL数据库中选择一些数据。

SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand("PROC001", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
datagridview.DataSource = dt;

之后,我可以使用dt.DefaultView.Filter = ....过滤或排序我的datagridview,并在我的网格中仅显示已过滤的行。 在CellMouseDoubleClick事件中,我的第二个Form2出现了。在这种形式中,我通过单击Button1更新数据库中的一些值,之后我想更新我选择的datagridview行。我的疑问是:

1)如何只更新datagridview中的选定行,并且不再为所有datagridview填充执行存储过程。

2)我的datagridview已经过滤,所以如果我再次执行过程,我的过滤器就会消失。我怎么能避免这个?

3)在Form2上我正在更新一些数据库值,这个值不包含在我的“选择查询”中作为选定字段,但此值会受此查询影响。例如:

SELECT Name, SecondName FROM tUsers 
  WHERE id = (SELECT DISTINCT id FROM tProcedures WHERE Code = 'First')

在我的datagridview中,我可以看到Name和SecondName,但在Form2中我正在更新tProcedures数据库表中的Code。所以更新后我想在datagridview中看到我的新数据,只在选定的行和当前过滤器中。我不想再将所有数据选择到datagridview并破坏我的过滤器。

是否可以更新单行?你能提供一些例子吗?

1 个答案:

答案 0 :(得分:0)

因为DataGridView正在使用DataBinding,所以您必须更新基础数据源,在本例中为DataTable。有关如何执行此操作,请参阅How to: Edit Rows in a DataTable

对于过滤器问题,您需要保存并恢复过滤器:

var filter = dt.DefaultView.RowFilter;
UpdateData();
dt.DefaultView.RowFilter = filter;