.net 如何处理父窗口的刷新?

.net 如何处理父窗口的刷新?,.net,winforms,datagridview,.net,Winforms,Datagridview,我有一个表单,它可以导致另一个表单显示 第一个表单上的激活事件当前刷新DataGridView 如何在DataGridView上保留行选择?刷新DataGridView会导致选择第一行 DataGridView中的数据通过以下方式刷新: MyDataGridView.DataSource = getDataTableFromDb(); 其中getDataTableFromDb()返回一个DataTable,若要解决此问题,您可能需要一个BindingSource——这不是问题,因为没有任何理由

我有一个表单,它可以导致另一个表单显示

第一个表单上的
激活事件当前刷新
DataGridView

如何在
DataGridView
上保留行选择?刷新
DataGridView
会导致选择第一行

DataGridView
中的数据通过以下方式刷新:

MyDataGridView.DataSource = getDataTableFromDb();

其中
getDataTableFromDb()
返回一个
DataTable

,若要解决此问题,您可能需要一个
BindingSource
——这不是问题,因为没有任何理由不使用它

您只需将
BindingSource
控件拖动到表单的设计图面上,就像任何其他控件一样

然后将
DataTable
作为绑定源的数据源,并将绑定源作为网格的数据源

设置绑定源代码的代码非常简单:

bindingSource1.DataSource = getDataTableFromDb();
MyDataGridView.DataSource = bindingSource1;
这可能足以解决您的问题。(我看到它在某些场景中起作用)


如果位置仍然没有被维护,那么对于绑定源,您现在可以使用
Find
position
成员

首先-在重新绑定之前,您需要获取有关当前所选项目的一些独特信息。通常是数据库中的主键

您可以从绑定源的
Current
属性中获取此信息,类似于:

DataRowView r = bs.Current as DataRowView;
var id = int.Parse(r.Row.ItemArray[0].ToString());
int index = bs.Find("CustomerId", 3);
bs.Position = index;
然后,使用此id,在重新绑定网格后,具有如下内容:

DataRowView r = bs.Current as DataRowView;
var id = int.Parse(r.Row.ItemArray[0].ToString());
int index = bs.Find("CustomerId", 3);
bs.Position = index;
上面的“CustomerId”属性是表示数据表中使用的主键列的name属性



需要注意的一点是,这只适用于您的数据源—DataTable支持开箱即用的查找。如果更改为BindingList之类的内容,则需要自己实现FindCore成员。

这一问题的答案取决于刷新datagridview的方式以及用作数据源的内容。你能提供这些信息吗?@DavidHall:数据源是一个
DataTable
,每次刷新
DataGridView
时都会从数据库中检索。只需将
DataSource
设置为
DataTable
,即可实现刷新,即
MyDataGridView.DataSource=getDataTableFromDb()
是否可以在代码中以与
数据源
相同的方式设置
BindingSource
属性?@CJ7是的,它可以-绑定源有一个数据源,您可以使用BindingSource作为数据源。我已经在我的答案的编辑中展示了这一点。