2013-02-06 34 views
10

私はコントロールのmousedownイベントとclickイベントを持っています。 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'イベントのみ火災をドロップ:あなたのコードを見て、このようにしてください。これはあなたの問題かもしれません。 – SysDragon

+0

'クリックするだけでポインタをドラッグしないで起動する場合は、代わりに' MouseUp'を使用してみてください。 – Pezzzz

+0

@SysDragon私も同じことをしています。それでもクリックイベントは起きません。 –

答えて

22

これは仕様です。 MouseDownイベントは、マウスのControl.Captureプロパティをキャプチャします。組み込みのMouseUpイベントハンドラは、マウスがまだキャプチャされていて、マウスがあまり移動していないかどうかをチェックしてから、Clickイベントを発生させます。問題は、DoDragDrop()を呼び出すとマウスのキャプチャがキャンセルされることです。 Drag&Drop操作を実装するためにマウスイベントが使用されて以来、必然的にそうです。したがって、ClickイベントやDoubleClickイベントは決して得られません。

クリック数がのドラッグ&ドロップの両方に対応する必要があるコントロールは使いやすさの問題です。しかし、修正可能ですが、あなたがする必要があるのは、マウスが元のマウスの下の位置から十分に移動したことを確認することです。、次にがドラッグを開始します。ドラッグしてC#のバージョンを必要とする人のための

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

を、あなたは離れて、ポインタをdragingせずにマウスボタンを離すと

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

関連する問題