Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 404
Troy Mitchel Avatar asked Jul 19 '12 18:07

Troy Mitchel


2 Answers

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.

like image 184
LarsTech Avatar answered Oct 22 '22 23:10

LarsTech


UPDATE:

Instead of

 If dragIndex < 0 Then dragIndex = DataGridView1.RowCount - 1

change to

 If dragIndex > -1 Then 
      'action if not selected in the row header and blank space
 else
      'return error if selected in the column header and blank space
 end if

then a error occurs when you drag a row to the "blank zone", if you don't believe me, you must to try it.

the final code (Only for the part "The drag events") is this:

  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
    'Determine if dragindex is valid row index       
    If dragIndex > -1 Then
        If (e.Effect = DragDropEffects.Move) Then
            Dim dragRow As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)
            DataGridView1.Rows.RemoveAt(fromIndex)
            DataGridView1.Rows.Insert(dragIndex, dragRow)
            'Add this line of code if you want to put selected rows to the rows that change
            DataGridView1.Rows(dragIndex).Selected = True
        End If 
       Else 'Do any message here if selected in column header and blank space. 
       End If
    End Sub
like image 26
Adrian LG Avatar answered Oct 23 '22 00:10

Adrian LG