Partial Public Class Form1 Inherits System.Windows.Forms.Form Private dragBox As Rectangle Private Sub dgv1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles dgv1.MouseDown Dim sz As Size = SystemInformation.DragSize dragBox = New Rectangle(e.X - sz.Width \ 2, e.Y - sz.Height \ 2, sz.Width, sz.Height) End Sub Private Sub dgv1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles dgv1.MouseUp dragBox = Rectangle.Empty End Sub Private Sub dgv1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles dgv1.MouseMove If e.Button = MouseButtons.Left AndAlso Not dragBox.IsEmpty AndAlso dragBox.Contains(e.X, e.Y) Then dragBox = Rectangle.Empty Dim ht As DataGridView.HitTestInfo = dgv1.HitTest(e.X, e.Y) If ht.RowIndex >= 0 Then Dim row As DataGridViewRow = dgv1.Rows(ht.RowIndex) Dim data As New ArrayList() For Each cell As DataGridViewCell In row.Cells data.Add(cell.Value) Next 'ここでは、コピーするデータを「配列」として渡している Dim effect As DragDropEffects = dgv1.DoDragDrop( _ data.ToArray(), _ DragDropEffects.Copy Or DragDropEffects.Move) If CBool(effect And DragDropEffects.Move) Then dgv1.Rows.Remove(row) '移動が行われた場合は元データを削除する End If End If End If End Sub 'コピー/移動の切り替えが不要な場合は、DragOver イベントよりも DragEnter イベントの方が良いかも Private Sub dgv2_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles dgv2.DragOver If Not e.Data.GetDataPresent(GetType(Object())) Then Return '意図しないデータなので無視 End If 'ドラッグ中に Ctrl キーが押された場合は、コピー動作として扱う Dim isCopy As Boolean = CBool(e.AllowedEffect And DragDropEffects.Copy) AndAlso CBool(e.KeyState And &H8) Dim isMove As Boolean = Not isCopy AndAlso CBool(e.AllowedEffect And DragDropEffects.Move) If isCopy Then e.Effect = DragDropEffects.Copy ElseIf isMove Then e.Effect = DragDropEffects.Move Else Return End If 'ドラッグ先を選択状態にして、どこにドロップされるのかが分かるようにする dgv2.ClearSelection() Dim pt As Point = dgv2.PointToClient(New Point(e.X, e.Y)) Dim ht As DataGridView.HitTestInfo = dgv2.HitTest(pt.X, pt.Y) If ht.RowIndex >= 0 Then 'データ部のセルまたは行ヘッダ上にいる場合 dgv2.Rows(ht.RowIndex).Selected = True Else '領域外にいる場合はドロップ禁止 e.Effect = DragDropEffects.None End If End Sub 'ドロップされる側の処理 Private Sub dgv2_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles dgv2.DragDrop Dim data() As Object = e.Data.GetData(GetType(Object())) If data Is Nothing Then Return '意図しないデータなので無視 End If Dim pt As Point = dgv2.PointToClient(New Point(e.X, e.Y)) Dim ht As DataGridView.HitTestInfo = dgv2.HitTest(pt.X, pt.Y) dgv2.ClearSelection() 'ドロップ先のひとつ上の行に挿入し、挿入した新規行を選択状態にする '(一番下に追加したい場合にはどうする?) Dim newRowIndex As Integer = ht.RowIndex dgv2.Rows.Insert(newRowIndex, data) dgv2.Rows(newRowIndex).Selected = True End Sub End Class