1

単一の DataGridView で基本的なドラッグ/ドロップ機能を使用しています。このような:

Private Sub DataGridView1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles DataGridView1.DragDrop
    Dim p As Point = Me.PointToClient(New Point(e.X, e.Y))
    dropindex = DataGridView1.HitTest(p.X, p.Y).RowIndex

    If (e.Effect = DragDropEffects.Move) Then
        Dim dragRow As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)

        '' SOME PROCEDURE HERE FOR DROPPING ---
    End If
End Sub

Private Sub DataGridView1_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles DataGridView1.DragOver
    e.Effect = DragDropEffects.Move
End Sub

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

    dragindex = DataGridView1.HitTest(e.X, e.Y).RowIndex
    If dragindex > -1 Then
        Dim dragSize As Size = SystemInformation.DragSize
        dragrect = New Rectangle(New Point(CInt(e.X - (dragSize.Width / 2)), CInt(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 System.Windows.Forms.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
            Me.DoDragDrop(DataGridView1.Rows(dragindex), DragDropEffects.Move)
        End If
    End If
End Sub

マウスの左ボタンを押してドラッグを開始すると、カーソルの下に四角形が表示され、ドラッグが開始されます。
特定の行のドロップでボタンを離すと、(通常:)

しかし、ドラッグ中に気が変わってESCキーを押すと、カーソルの下の四角形は消えますが、ボタンを離すとドロップが発生します。

ドラッグがすでに開始されているときにドロップをキャンセルするにはどうすればよいですか (たとえば、ESC キーで)?

4

2 に答える 2

1

ドラッグ アンド ドロップ中にトリガーされないため、DataGridView のキー イベント メソッドに依存して ESC を追跡することはできません。しかし、この状況を説明する簡単な方法があります (ドラッグ アンド ドロップ プロセスが中断されます) DragLeave Event。このメソッドで設定されたグローバル フラグに応じてドロップの条件を設定できます。サンプルコード:

Dim cancelDrop As Boolean
Private Sub DataGridView1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles DataGridView1.DragDrop
    Dim p As Point = Me.PointToClient(New Point(e.X, e.Y))
    dropindex = DataGridView1.HitTest(p.X, p.Y).RowIndex

    If (e.Effect = DragDropEffects.Move AndAlso Not cancelDrop) Then
        Dim dragRow As DataGridViewRow = CType(e.Data.GetData(GetType(DataGridViewRow)), DataGridViewRow)

        '' SOME PROCEDURE HERE FOR DROPPING ---
    End If
    cancelDrop = False
End Sub
Private Sub DataGridView1_DragLeave(sender As Object, e As System.EventArgs) Handles DataGridView1.DragLeave
    cancelDrop = True
End Sub
于 2013-10-19T21:17:54.503 に答える