[英]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.