此代码
CurrentSelectedRow = Me.dgvPreviouslyCut.CurrentRow.Index
在数据网格视图控件中存储用户单击的当前选定行。刷新数据网格视图的数据源后,下面的代码
Me.dgvPreviouslyCut.Rows(CurrentSelectedRow).Selected = True
以编程方式重新选择同一行。
紧接着
Me.dgvPreviouslyCut.CurrentRow.Index
总是被设置为零,而不是你期望的变量CurrentSelectedRow。
为什么以编程方式设置select行索引不会导致属性CurrentRow。索引设置为相同?
CurrentRow
是包含当前活动单元格的行。当您将DataGridView绑定到外部数据源时,此属性将重置为其默认值,即第一列中的第一个单元格。
SelectedRow
是当前选中/突出显示的行。根据MultiSelect
的性质,可以是一行或多行。要选择一行,您必须将其Selected
属性设置为true。
通过将行设置为选中,您只是将其高亮显示,而不是使其处于活动状态。
要保留当前单元格,必须存储当前单元格的行和列索引。使用CurrentCellAddress
属性来获取它们。刷新DataSource
后,使用这些索引设置CurrentCell属性。
dataGridView1.CurrentCell = dataGridView1.Rows(rowindex).Cells(columnindex);
当数据源被更改时,DataGridView
创建一个新的CurrencyManager。如果此CM包含项,则默认位置为0
,因此将其压入DGV并选择第一行。
要解决这个问题,只需设置CM的位置:
Me.dgvPreviouslyCut.DataSource = my_new_datasource
Dim cm As CurrencyManager = CType(Me.BindingContext(my_new_datasource), CurrencyManager)
If ((Me.CurrentSelectedRow > -1) AndAlso (Me.CurrentSelectedRow < cm.Count)) Then
cm.Position = Me.CurrentSelectedRow
End If