Why doesn't doubleclick event fire after mouseDown event on same element fires?

前端 未结 2 730
一生所求
一生所求 2020-12-02 01:54

I have a mousedown event and click event on a control. the mousedown event is used for starting dragdrop operation. The control I am using is a Dirlistbox.

          


        
相关标签:
2条回答
  • 2020-12-02 02:24

    for who needs c# version with drag and drop

        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 讨论(0)
  • 2020-12-02 02:25

    This is by design. The MouseDown event captures the mouse, Control.Capture property. The built-in MouseUp event handler checks if the mouse is still captured and the mouse hasn't moved too far, then fires the Click event. Trouble is that calling DoDragDrop() will cancel mouse capture. Necessarily so since mouse events are now used to implement the drag+drop operation. So you'll never get the Click nor the DoubleClick event.

    Controls that both need to respond to clicks and drag+drop are a usability problem. It is fixable however, what you need to do is ensure that the user has moved the mouse enough from the original mouse down location, then start the drag. Make your code look like this:

    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)
提交回复
热议问题