我有一个表格可以显示另一个表格。
第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
andPosition
成员。
首先 - 在您重新绑定之前,您需要获取有关当前所选项目的一些独特信息。通常来自数据库的主键。
您可以从绑定源的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;
上面的“CustomerId”属性是代表您在数据表中使用的主键列的名称属性。
需要注意的重要一点是,这只适用于您的数据源 - DataTable 支持“开箱即用”。如果您更改为 BindingList 之类的东西,您将需要自己实现 FindCore 成员。