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