- 題名: DataGridViewの行選択
- 日時: 2009/08/12 16:03:28
- ID: 25188
- この記事の返信元:
- (なし)
- この記事への返信:
- [25189] Re[1]: DataGridViewの行選択2009/08/12 19:03:26
- ツリーを表示
お疲れ様です 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
分類:[.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行を選択状態になるのですが、
クリックしてからマウスを離すまではそのとき選択した行のみが選択状態となります。
マウスダウンイベントをとってみたのですが、
それだとクリックした行が選択行であると認識されません。
マウスクリック開始時から希望の動作をさせる方法はありますでしょうか?
よろしくお願いします。