2012-09-27 61 views
0

我有一个可以导致另一个窗体显示的窗体。如何处理父窗口的刷新?

第一种形式的Activated事件当前刷新了DataGridView

如何保留DataGridView上的行选择?刷新DataGridView会导致第一行被选中。

DataGridView中的数据由下列刷新:

MyDataGridView.DataSource = getDataTableFromDb(); 

getDataTableFromDb()其中返回DataTable

+0

对此的回答取决于您如何刷新datagridview以及您用作数据源的内容。你能提供这些信息吗? –

+0

@DavidHall:数据源是每次刷新DataGridView时从数据库中检索的DataTable。只需将DataSource设置为DataTable即可实现刷新。 'MyDataGridView。DataSource = getDataTableFromDb();' – CJ7

回答

1

要解决这个问题,您可能需要一个BindingSource - 这不是问题,因为没有任何理由不会有问题。

您可以简单地将BindingSource控件拖到窗体的设计图面上,就像其他控件一样。

然后,您创建绑定源的数据源DataTable,并使绑定源成为网格的数据源。

建立一个绑定的源代码是非常简单的:

bindingSource1.DataSource = getDataTableFromDb(); 
MyDataGridView.DataSource = bindingSource1; 

可能足以解决你的问题。 (我已经看到了它在某些情况下工作)


如果位置仍然没有维持那么你现在可以使用FindPosition成员绑定源。

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

您可以从绑定源的Current财产得到这个,是这样的:

DataRowView r = bs.Current as DataRowView; 
var id = int.Parse(r.Row.ItemArray[0].ToString()); 
与此ID

然后,重新绑定网后,有这样的事:

int index = bs.Find("CustomerId", 3); 
bs.Position = index; 

的“客户ID “以上属性是表示您使用的主键列的名称属性 - 数据表中的


需要注意的一件重要的事情是,这只适用于您的数据源 - DataTable支持Find out of the box。如果你改变成类似BindingList的东西,你将需要自己实现FindCore成员。

+0

''BindingSource'属性是否可以像'DataSource'一样在代码中设置? – CJ7

+0

@ CJ7是的,它可以 - 绑定源有一个数据源,你可以使用BindingSource作为数据源。我已经在编辑中显示了我的答案。 –