このコード
CurrentSelectedRow = Me.dgvPreviouslyCut.CurrentRow.Index
ユーザーがクリックした現在選択されている行をデータグリッドビューコントロールに格納します。データグリッドビューのデータソースを更新した後、このコード
Me.dgvPreviouslyCut.Rows(CurrentSelectedRow).Selected = True
プログラムで同じ行を再選択します。
直後でも
Me.dgvPreviouslyCut.CurrentRow.Index
期待どおりに変数CurrentSelectedRowではなく、常にゼロに設定されます。
選択行インデックスをプログラムで設定しても、プロパティCurrentRow.Indexが同じに設定されないのはなぜですか?
CurrentRow
は、現在アクティブなセルを含む行です。 DataGridViewを外部データソースにバインドすると、このプロパティはデフォルト値にリセットされます。これは、最初の列の最初のセルです。
SelectedRow
は、現在選択/強調表示されている行です。 MultiSelect
プロパティに応じて、1つ以上の行になる場合があります。行を選択するには、その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