vb.netvisual-studio-2010datagridviewdrag-and-dropdatagridviewrow

How to drag and drop row within the same datagridview


In a Windows App (Visual Studio)(VB) how do you drag and drop a single row to another postition to allow for the user to re-order the row? I haven't found any worthy examples for this yet.


Solution

  • Here is a vb version from this C# answer: How could I Drag and Drop DataGridView Rows under each other?

    The form class variables:

    Private fromIndex As Integer
    Private dragIndex As Integer
    Private dragRect As Rectangle
    

    The drag events:

    Private Sub DataGridView1_DragDrop(ByVal sender As Object, _
                                       ByVal e As DragEventArgs) _
                                       Handles DataGridView1.DragDrop
      Dim p As Point = DataGridView1.PointToClient(New Point(e.X, e.Y))
      dragIndex = DataGridView1.HitTest(p.X, p.Y).RowIndex
      If (e.Effect = DragDropEffects.Move) Then
        Dim dragRow As DataGridViewRow = e.Data.GetData(GetType(DataGridViewRow))
        DataGridView1.Rows.RemoveAt(fromIndex)
        DataGridView1.Rows.Insert(dragIndex, dragRow)
      End If
    End Sub
    
    Private Sub DataGridView1_DragOver(ByVal sender As Object, _
                                       ByVal e As DragEventArgs) _
                                       Handles DataGridView1.DragOver
      e.Effect = DragDropEffects.Move
    End Sub
    

    The mouse events:

    Private Sub DataGridView1_MouseDown(ByVal sender As Object, _
                                        ByVal e As MouseEventArgs) _
                                        Handles DataGridView1.MouseDown
      fromIndex = DataGridView1.HitTest(e.X, e.Y).RowIndex
      If fromIndex > -1 Then
        Dim dragSize As Size = SystemInformation.DragSize
        dragRect = New Rectangle(New Point(e.X - (dragSize.Width / 2), _
                                           e.Y - (dragSize.Height / 2)), _
                                 dragSize)
      Else
        dragRect = Rectangle.Empty
      End If
    End Sub
    
    Private Sub DataGridView1_MouseMove(ByVal sender As Object, _
                                        ByVal e As MouseEventArgs) _
                                        Handles DataGridView1.MouseMove
      If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
        If (dragRect <> Rectangle.Empty _
        AndAlso Not dragRect.Contains(e.X, e.Y)) Then
          DataGridView1.DoDragDrop(DataGridView1.Rows(fromIndex), _
                                   DragDropEffects.Move)
        End If
      End If
    End Sub
    

    Make sure you have the grids AllowDrop property set to true.