DataGrid Single Selection
Come molti di voi sapranno per far sì che sul DataGrid si possa selezionare una sola riga si ricorre spesso alla soluzione reperibile su Syncfusion.com di cui riporto di seguito il codice:
Public Class MyDataGrid
Inherits DataGrid
Private oldSelectedRow As Integer
Protected Overloads Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
‘don’t call the base class if left mouse down
If (e.Button <> MouseButtons.Left) Then
MyBase.OnMouseMove(e)
End If
End Sub
Protected Overloads Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
‘don’t call the base class if in header
Dim hti As DataGrid.HitTestInfo
hti = Me.HitTest(New Point(e.X, e.Y))
If (hti.Type = DataGrid.HitTestType.Cell) Then
If (oldSelectedRow > -(1)) Then
Me.UnSelect(oldSelectedRow)
End If
oldSelectedRow = -(1)
MyBase.OnMouseDown(e)
Else
If (hti.Type = DataGrid.HitTestType.RowHeader) Then
If (oldSelectedRow > -(1)) Then
Me.UnSelect(oldSelectedRow)
End If
If ((Control.ModifierKeys And Keys.Shift) = 0) Then
MyBase.OnMouseDown(e)
Else
Me.CurrentCell = New DataGridCell(hti.Row, hti.Column)
End If
Me.Select(hti.Row)
oldSelectedRow = hti.Row
End If
End If
End Sub
End Class
Ciò però non è sufficiente infatti se l’utente preme la combinazione di tasti Ctrl+A seleziona tutte le righe.
Bisogna quindi aggiungere il seguente codice:
Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
If keyData = (Windows.Forms.Keys.Control Or Windows.Forms.Keys.A) Then Return True
Return
MyBase.ProcessDialogKey(keyData)
End Function