我有一个可以导致另一个窗体显示的窗体。如何处理父窗口的刷新?
第一种形式的Activated
事件当前刷新了DataGridView
。
如何保留DataGridView
上的行选择?刷新DataGridView
会导致第一行被选中。
在DataGridView
中的数据由下列刷新:
MyDataGridView.DataSource = getDataTableFromDb();
getDataTableFromDb()
其中返回DataTable
。
我有一个可以导致另一个窗体显示的窗体。如何处理父窗口的刷新?
第一种形式的Activated
事件当前刷新了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());
与此ID
然后,重新绑定网后,有这样的事:
int index = bs.Find("CustomerId", 3);
bs.Position = index;
的“客户ID “以上属性是表示您使用的主键列的名称属性 - 数据表中的。
需要注意的一件重要的事情是,这只适用于您的数据源 - DataTable支持Find out of the box。如果你改变成类似BindingList的东西,你将需要自己实现FindCore成员。
''BindingSource'属性是否可以像'DataSource'一样在代码中设置? – CJ7
@ CJ7是的,它可以 - 绑定源有一个数据源,你可以使用BindingSource作为数据源。我已经在编辑中显示了我的答案。 –
对此的回答取决于您如何刷新datagridview以及您用作数据源的内容。你能提供这些信息吗? –
@DavidHall:数据源是每次刷新DataGridView时从数据库中检索的DataTable。只需将DataSource设置为DataTable即可实现刷新。 'MyDataGridView。DataSource = getDataTableFromDb();' – CJ7