2013-02-06 42 views
10

我有一個mousedown事件,並在控件上單擊事件。 mousedown事件用於啓動拖放操作。我正在使用的控件是Dirlistbox。爲什麼不在相同元素上的mouseDown事件觸發後雙擊事件觸發?

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

    Dim lab As New Label 
    lab.Text = Dir1.DirList(Dir1.DirListIndex) 
    lab.DoDragDrop(lab, DragDropEffects.Copy) 

End Sub 

但是,當我點擊控件,然後只有mousedown事件觸發,點擊事件不會觸發。 如果我在mousedown事件中註釋掉「lab.DoDragDrop(lab,DragDropEffects.Copy)」,那麼點擊事件就會被觸發。 我可以做什麼,以便當我點擊控件時,mousedown和click事件都會觸發?

+0

我想'Click'事件僅觸發如果你鬆開鼠標按鈕而不draging指針了。這可能是你的問題。 – SysDragon

+0

如果'click'只在沒有拖動指針的情況下觸發,請嘗試使用'MouseUp'來代替? – Pezzzz

+0

@SysDragon我正在做同樣的事情,即使這樣,點擊事件並沒有得到解決。 –

回答

22

這是設計。 MouseDown事件捕獲鼠標,Control.Capture屬性。內置的MouseUp事件處理程序檢查鼠標是否仍被捕獲,鼠標是否移動得太遠,然後觸發Click事件。麻煩的是,調用DoDragDrop()將取消鼠標捕獲。必須這樣做,因爲鼠標事件現在用於實現拖放操作。因此,您永遠無法獲得點擊和DoubleClick活動。

控件既需要響應點擊拖放是一個可用性問題。然而,它是可以修復的,你需要做的是確保用戶已經將鼠標從原始的鼠標位置移開了,然後然後開始拖動。使你的代碼是這樣的:

Private MouseDownPos As Point 

Private Sub Dir1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Dir1.MouseDown 
    MouseDownPos = e.Location 
End Sub 

Private Sub Dir1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Dir1.MouseMove 
    If e.Button And MouseButtons.Left = MouseButtons.Left Then 
     Dim dx = e.X - MouseDownPos.X 
     Dim dy = e.Y - MouseDownPos.Y 
     If Math.Abs(dx) >= SystemInformation.DoubleClickSize.Width OrElse _ 
      Math.Abs(dy) >= SystemInformation.DoubleClickSize.Height Then 
      '' Start the drag here 
      ''... 
     End If 
    End If 
End Sub 
+0

它的工作原理,感謝的人。 –

+0

感謝 - MouseDown - > MouseMove解決方案是相當明顯的,但我不知道SystemInformation.DoubleClickSize信息,所以這真的很有用:) –

+0

「控制,都需要響應點擊和拖放是一個可用性問題」 。你可能想要用左鍵來處理拖放,然後點擊右鍵。 – gadjou

1

誰需要C#版本與拖放

private Point MouseDownPos; 
    private void dataGridView1_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     MouseDownPos = e.Location; 
    } 

    private void dataGridView1_MouseMove(System.Object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      dynamic dx = e.X - MouseDownPos.X; 
      dynamic dy = e.Y - MouseDownPos.Y; 
      if (Math.Abs(dx) >= SystemInformation.DoubleClickSize.Width || Math.Abs(dy) >= SystemInformation.DoubleClickSize.Height) 
      { 
       DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y); 
       if (info.RowIndex >= 0) 
       { 
        DataRowView view = (DataRowView) 
          dataGridView1.Rows[info.RowIndex].DataBoundItem; 

        if (view != null) 
         dataGridView1.DoDragDrop(view, DragDropEffects.Move); 

       } 
      } 
     } 
    } 
+0

爲了解決這個問題,我浪費了不少讀者的建議,這是我發現實際工作的唯一一個。謝謝! – BenevolentDeity

相關問題