■No35626に返信(HKaneさんの記事)
> 1行のみ、または、連続行選択のみを許し、> 例えば10行あるデータで2行目と5行目のみの選択のような歯抜け選択を許さないようにする方法はあるでしょうか?
泥臭い方法しか思いつきませんでした。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DataGridView1.AllowUserToAddRows = False
DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
DataGridView1.ColumnCount = 10
DataGridView1.RowCount = 1000
End Sub
Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
Dim selectedRows = DataGridView1.SelectedRows.OfType(Of DataGridViewRow)().ToArray()
Dim firstRow = selectedRows.FirstOrDefault()
Dim lastRow = selectedRows.LastOrDefault()
If If(firstRow, lastRow) Is Nothing Then
Return
End If
Dim firstRowIndex = selectedRows.Min(Function(r) r.Index)
Dim lastRowIndex = selectedRows.Max(Function(r) r.Index)
If selectedRows.Length < (lastRowIndex - firstRowIndex) + 1 Then
Dim unselectedRows = DataGridView1.Rows.Cast(Of DataGridViewRow)() _
.Skip(firstRowIndex) _
.Take(lastRowIndex - firstRowIndex + 1) _
.Where(Function(r) Not r.Selected) _
.ToArray()
For Each row In unselectedRows
row.Selected = True
Next
End If
End Sub
End Class
■No35626に返信(HKaneさんの記事)
> DataGridViewで、> SelectionMode = FullRowSelect> MultiSelect = True> の状態にすると、複数行選択が可能ですが、> 1行のみ、または、連続行選択のみを許し、> 例えば10行あるデータで2行目と5行目のみの選択のような歯抜け選択を許さないようにする方法はあるでしょうか?
DataGridView を継承したコントロールを作り、SetSelectedRowCore をオーバーライドして、すでに選択された行が存在する場合、上の行か下の行が選択状態かどうかをチェックするといいのでは。
Public Class DataGridViewEx
Inherits DataGridView
Protected Overrides Sub SetSelectedRowCore(rowIndex As Integer, selected As Boolean)
If selected AndAlso SelectedRows.Count > 0 Then
If Not IsRowSelected(rowIndex + 1) AndAlso Not IsRowSelected(rowIndex - 1) Then
selected = False
End If
End If
MyBase.SetSelectedRowCore(rowIndex, selected)
End Sub
Private Function IsRowSelected(rowIndex As Integer) As Boolean
If rowIndex >= 0 AndAlso rowIndex < RowCount Then
Return Rows(rowIndex).Selected
End If
Return False
End Function
End Class