web-dev-qa-db-ja.com

データグリッドビュー...プログラムで選択行インデックスを設定しても、CurrentRow.Indexは同じに設定されませんか?

このコード

CurrentSelectedRow = Me.dgvPreviouslyCut.CurrentRow.Index

ユーザーがクリックした現在選択されている行をデータグリッドビューコントロールに格納します。データグリッドビューのデータソースを更新した後、このコード

Me.dgvPreviouslyCut.Rows(CurrentSelectedRow).Selected = True

プログラムで同じ行を再選択します。

直後でも

 Me.dgvPreviouslyCut.CurrentRow.Index

期待どおりに変数CurrentSelectedRowではなく、常にゼロに設定されます。

選択行インデックスをプログラムで設定しても、プロパティCurrentRow.Indexが同じに設定されないのはなぜですか?

6
Killakeys

CurrentRowは、現在アクティブなセルを含む行です。 DataGridViewを外部データソースにバインドすると、このプロパティはデフォルト値にリセットされます。これは、最初の列の最初のセルです。

SelectedRowは、現在選択/強調表示されている行です。 MultiSelectプロパティに応じて、1つ以上の行になる場合があります。行を選択するには、そのSelectedプロパティをtrueに設定する必要があります。

行を選択済みとして設定することにより、アクティブにせずに強調表示したままにするだけです。

現在のセルを保持するには、現在のセルの行と列のインデックスを保存する必要があります。それらを取得するには、CurrentCellAddressプロパティを使用します。更新したら、DataSourceはこれらのインデックスを使用してCurrentCellプロパティを設定します。

dataGridView1.CurrentCell = dataGridView1.Rows(rowindex).Cells(columnindex);
13
Junaith

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