ドラッグ&ドロップでデータグリッドビューの列を移動する

サンプルコード

Private Sub Form1_Load_
   (ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
      DataGridView1.AllowDrop = True
End Sub

Private Sub DataGridView1_MouseDown _
   (ByVal sender As System.Object, _
    ByVal e As System.Windows.Forms.MouseEventArgs) _
    Handles DataGridView1.MouseDown

      Dim obj As DataGridView = CType(sender, DataGridView)
      Dim RowsObj() As DataGridViewRow = _
         (From d As Windows.Forms.DataGridViewRow _
          In obj.SelectedRows Order By d.Index _
          Ascending).ToArray
     
      Dim test As DataGridView.HitTestInfo = obj.HitTest(e.X, e.Y)
      If RowsObj.Length > 0 AndAlso _
         test.RowIndex = RowsObj(0).Index And _
         test.Type = DataGridViewHitTestType.RowHeader Then
            
         Dim dragEffect As DragDropEffects = _
             obj.DoDragDrop(RowsObj, DragDropEffects.Move)
      End If

End Sub

Private Sub DataGridView1_DragOver _
    (ByVal sender As System.Object, _
     ByVal e As System.Windows.Forms.DragEventArgs) _
     Handles DataGridView1.DragOver

     e.Effect = DragDropEffects.Move
     Dim obj As DataGridView = CType(sender, DataGridView)
     Dim test As DataGridView.HitTestInfo = obj.HitTest(e.X, e.Y)

End Sub

    Private Sub DataGridView1_DragDrop _
       (ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.DragEventArgs)_
        Handles DataGridView1.DragDrop

         Dim obj As DataGridView = CType(sender, DataGridView)
         Dim OnthePoint As New Drawing.Point(e.X, e.Y)
         Dim test As DataGridView.HitTestInfo = _
            obj.HitTest(obj.PointToClient(OnthePoint).X,  _
            obj.PointToClient(OnthePoint).Y)

         Dim Item As DataGridViewRow() = _
            CType(e.Data.GetData(GetType(DataGridViewRow())),_
                                       DataGridViewRow())

        For i As Integer = UBound(Item) To 0 Step -1
            InsertRows(obj, test.RowIndex, Item(i))
        Next

        Do Until obj.SelectedRows.Count = 0
            obj.Rows.RemoveAt(obj.SelectedRows(0).Index)
        Loop
        
    End Sub

   Private Sub InsertRows_
      (ByVal Continer As DataGridView, _
       ByVal index As Integer, _
       ByVal Item As DataGridViewRow)
        
         Dim temp As String()
        
         For Each ccc As DataGridViewCell In Item.Cells
            If temp Is Nothing Then : ReDim temp(0)
            Else : ReDim Preserve temp(temp.Length)
            End If
            temp(UBound(temp)) = ccc.Value
         Next
        
         Item.DataGridView.Rows.Insert(index, temp)
        
         For Each CellObj As DataGridViewCell In _
            Continer.Rows(index).Cells
            CellObj.Style = Item.Cells(CellObj.ColumnIndex).Style
         Next
    End Sub

ちょっと強引だけどやりたいことはできてると思います。 詳しくは何か参考書を見るか、後日の修正まで待ってください 。