2013-02-06 21 views
10

Bir kontrol olayında bir olay vakası ve tıklama olayı var. mousedown olayı, dragdrop işlemini başlatmak için kullanılır. Kullandığım denetim bir Dirlistbox'tır.Aynı öğe yangınlarında mouseDown olayından sonra neden olay ateşini iki kere etkilemiyor?

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 

Ancak, denetimi tıklattığımda, yalnızca yoğun kullanılan etkinlik olayları tetiklendiğinde, olayı tıklatın. Eğer mousedown olayı "lab.DoDragDrop (lab, DragDropEffects.Copy)" yorumunda bulunursam olay tıklatıldığında ateşlenir. Denetimin üzerine tıkladığımda hem yansıma hem de tıklama olayının yanması için ne yapabilirim?

+0

Bence 'Click' olay sadece yangınları damla: kod bakmak böyle olun. Bu senin problemin olabilir. – SysDragon

+0

Eğer 'tıkla' sadece işaretçiyi sürüklemeden ateş ederse, bunun yerine 'MouseUp' kullanmayı deneyin. – Pezzzz

+0

@SysDragon Aynı şeyi yapıyorum, hatta tıklama olayı ateş almıyor. –

cevap

22

Bu, tasarım gereğidir. MouseDown olayı, fare Control.Capture özelliğini yakalar. Yerleşik MouseUp olay işleyicisi, farenin hala yakalanıp yakalanmadığını ve farenin çok uzağa gitmediğini kontrol eder, ardından Click olayını tetikler. Sorun şu ki, DoDragDrop() işlevi fare yakalamayı iptal edecektir. Fare olayları artık sürükleme + bırakma işlemini uygulamak için kullanıldığından beri gerekli. Bu yüzden, Tıklama ve DoubleClick olayını asla alamazsınız. Her iki ve sürükle + damla tıkladığında yanıt vermesi gerektiği

Kontroller bir kullanılabilirlik sorunu vardır. Ancak, düzeltmeniz gereken şey, kullanıcının fareyi orijinal fareden aşağı doğru hareket ettirdiğinden, sonra da sürüklemeyi başlattığından emin olmaktır. sürükle C# sürümünü kimin ihtiyacı için

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

çalışıyor, teşekkürler Man. –

+0

Teşekkürler - MouseDown -> MouseMove çözümü oldukça açıktı ancak SystemInformation.DoubleClickSize bilgilerinin farkında değildim, bu yüzden gerçekten yararlı oluyor :) –

+0

"Her ikisinin de tıklamalara ve sürükle + bırakmaya yanıt vermesi gereken denetimler, kullanılabilirlik sorunudur" . Sürükle ve bırak düğmesi ile sol tuşa basmak isteyebilirsiniz ve sağ tuşa tıklayın. – gadjou

1

ve uzak işaretçi draging olmadan fare düğmesini bırakın eğer

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

Farklı okuyucuların bu sorunu çözmek için önerilerini deneyen günleri boşa harcadım ve bu gerçekten işe yarayan tek bulduğum. Teşekkür ederim! – BenevolentDeity

İlgili konular