簡體   English   中英

取消DataGridView上的拖放

[英]Cancelling of Drag/Drop on DataGridView

我在單個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鍵說)?

   Me.DoDragDrop(DataGridView1.Rows(dragindex), DragDropEffects.Move)

你在那里弄錯了。 在調用DoDragDrop()的控件上引發QueryContinueDrag事件。 您使用了 ,使表單成為數據的來源。 但是您為DataGridView1實現了QueryContinueDrag,而不是表單。 所以你的事件處理程序從不運行 固定:

   DataGridView1.DoDragDrop(DataGridView1.Rows(dragindex), DragDropEffects.Move)

您無法通過依賴DataGridView的Key Event方法來跟蹤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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM