DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewの行選択

環境/言語:[WindowsXP , VB2005]
分類:[.NET]

[環境]
Windows XP SP2
Visual Vasic 2005
.NET Framework 3.5 SP1


いつもお世話になっております。

VB2005のDataGridViewで、クリックされた最新2行を選択状態にしたいです。

例:データ10行表示
@1行目クリック → 1行目選択
A3行目クリック → 1、3行目選択
B7行目クリック → 3、7行目選択


そこで、下記のようなコードを書きました。

------
grd:デザイナ上で定義されたDataGridView
grd.MultiSelect = True
grd.SelectionMode = DataGridViewSelectionMode.FullRowSelect
------

Private _SelectedRow(2) As Integer

Private Sub grd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles grd.Click

Dim intIndex As Integer = grd.SelectedCells.Item(0).RowIndex

_SelectedRow(2) = _SelectedRow(1)
_SelectedRow(1) = intIndex

For Each objRow As DataGridViewRow In grd.Rows
If Not (objRow.Index = _SelectedRow(1) Or objRow.Index = _SelectedRow(2)) Then
objRow.Selected = False
Else
objRow.Selected = True
End If
Next

End Sub

マウスのクリック状態が解除されると上記メソッドが実行され、
希望の通り選択された最新2行を選択状態になるのですが、
クリックしてからマウスを離すまではそのとき選択した行のみが選択状態となります。

マウスダウンイベントをとってみたのですが、
それだとクリックした行が選択行であると認識されません。

マウスクリック開始時から希望の動作をさせる方法はありますでしょうか?
よろしくお願いします。
お疲れ様です

SelectionChangedイベントで試してはいかがでしょうか?

Public Class Form5
    Inherits Form

    Private WithEvents _dgv As New DataGridView
    ' 選択した行番号を2つ格納するキュー
    Private _index As New Queue(Of Integer)
    ' SelectionChangedイベントハンドラの再入防止フラグ
    Private _isInSelectionChanged As Boolean = False

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Me._initialize()
        MyBase.OnLoad(e)
    End Sub

    ' 画面初期表示
    Private Sub _initialize()
        Me.Text = Me.GetType.Name

        With Me._dgv
            .RowCount = 10
            .ColumnCount = 5
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .MultiSelect = True
            .Dock = DockStyle.Fill
        End With

        Me.Controls.Add(Me._dgv)

    End Sub

    Private Sub _dgv_SelectionChanged(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles _dgv.SelectionChanged
        ' 番兵
        If Me._isInSelectionChanged Then Return
        If Me._dgv.SelectedCells.Count <= 0 Then Return

        ' 最新の選択した行のIndexをキューに入れる
        Dim index As Integer = Me._dgv.SelectedCells(0).RowIndex
        Me._index.Enqueue(index)

        ' キューの要素数を2つ以下に制限
        If Me._index.Count > 2 Then
            Me._index.Dequeue()
        End If

        ' 再入防止フラグを立てる
        Me._isInSelectionChanged = True
        ' 行の選択状態を設定
        For i As Integer = 0 To Me._dgv.Rows.Count - 1
            Me._dgv.Rows(i).Selected = Me._index.Contains(i)
        Next
        ' 再入防止フラグを解除
        Me._isInSelectionChanged = False

    End Sub

End Class
H.K.R.さん

ご教授頂いた方法で、希望の動作が実現できました!

返信が遅くなり、大変申し訳ございませんでした。

ありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板