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.
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
But when i click on the control then only the mousedown event fires, click event does not get fire. If I comment out "lab.DoDragDrop(lab, DragDropEffects.Copy)" in the mousedown event then click event gets fire. what can I do so that both mousedown and click event gets fire when i click on the control?
Note: This differs from the click event in that click is fired after a full click action occurs; that is, the mouse button is pressed and released while the pointer remains inside the same element. mousedown is fired the moment the button is initially pressed.
The dblclick event fires when a pointing device button (such as a mouse's primary button) is double-clicked; that is, when it's rapidly clicked twice on a single element within a very short span of time.
To detect double clicks with JavaScript you can use the event listener dblclick . The dblclick event is supported in all modern browsers for desktop/laptops, even Internet Explorer 11.
The dblclick event generates an event on double click the element. The event fires when an element is clicked twice in a very short span of time. We can also use the JavaScript's addEventListener() method to fire the double click event. In HTML, we can use the ondblclick attribute to create a double click event.
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
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);
}
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With