2013-10-19 5 views
1

단일 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 키 사용)?

답변

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 
+0

안녕하세요 Varocarbas. 솔루션은 작동하지만 추가 플래그 없이도 솔루션을 얻으려고합니다. 그렇지 않은 경우에는 하나의 부가적인 부울을 사용할 수 있습니다. –

+0

@ user973238 하나의 깃발은 큰 거래가 아닙니다 (실제로 거래가 아님). 또한 나는 당신이보고하는 행동이 다른 많은 방법으로 설명 될 수 없다는 것을 두려워합니다. e.Data.GetData 정보를 분석하여 다른 이벤트 (제안한 것)를 말하는지 또는 의존하고 있는지를 알 수 있습니다. 두 솔루션의 차이 (첫 번째 솔루션이 가능할 경우, 내가 모르는 솔루션). 또한 글로벌 플래그는 다른 곳에서 사용할 수있는 일부 정보 (삭제 취소)를 제공합니다. 그러나 잘 ... 그것은 당신에게 달렸습니다. – varocarbas

+0

광장이 사라지면 반드시 뭔가가 발생합니다. 하지만 구체적인 문제를 없애기 위해 당신의 제안을 받아 들일 것입니다. 충고에 감사하다. –

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

실수를 저질렀습니다. QueryContinueDrag 이벤트는 DoDragDrop()을 호출 한 컨트롤에서 발생합니다. Me을 사용하여 양식을 데이터 원본으로 사용했습니다. 그러나 폼이 아닌 DataGridView1에 대한 QueryContinueDrag를 구현했습니다. 따라서 이벤트 처리기가 실행되지 않습니다. 수정 :

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

눈이 아주 좋습니다! – Plutonix

+0

아아, QueryContinueDrag 코드를 삭제했지만 한스가 너무 빠름! 나는 그 코드를 서브 클래스에서 복사하기 때문에 Me가 남아있다. 추가 플래그없이 여기서 취소 할 수 있습니까? –