Я до сих пор не знаю, почему RowState меняется на 3, но у меня есть решение для нескольких выбранных строк. Пока я установил GridView.SelectedIndex в RowDataBound:
If LblPrimaryKey.Text.Equals(Me.CurrentID) Then
Me.MainGrid.SelectedIndex = e.Row.RowIndex
End If
Теперь я сохраняю только новый selectedIndex в переменной и устанавливаю его после этого:
If LblPrimaryKey.Text.Equals(Me.CurrentID) Then
selectedIndex = e.Row.RowIndex 'member variable'
'Me.MainGrid.SelectedIndex = e.Row.RowIndex'
End If
И после RowDataBound в функции, которая вызывает DataBind:
Me.MainGrid.DataBind()
Me.MainGrid.SelectedIndex = Me.selectedIndex
Теперь все старые выборки очищаются, и выбирается только одна строка.