2013-02-06 15 views
10

मेरे पास एक मूसडाउन घटना है और नियंत्रण पर ईवेंट पर क्लिक करें। 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 घटना में "lab.DoDragDrop (प्रयोगशाला, DragDropEffects.Copy)" टिप्पणी करता हूं तो ईवेंट को आग लगती है पर क्लिक करें। मैं क्या कर सकता हूं ताकि जब मैं नियंत्रण पर क्लिक करता हूं तो दोनों mousedown और क्लिक ईवेंट आग लग जाती है?

+0

मुझे लगता है कि 'Click' घटना केवल आग अगर आप सूचक दूर draging बिना माउस बटन छोड़ें। यह आपकी समस्या हो सकती है। – SysDragon

+0

यदि 'क्लिक' केवल पॉइंटर को खींचने के बिना ही आग लगती है, तो इसके बजाय 'माउसअप' का उपयोग करने का प्रयास करें? – Pezzzz

+0

@SysDragon मैं वही कर रहा हूं, फिर भी क्लिक ईवेंट को आग नहीं मिलती है। –

उत्तर

22

यह डिज़ाइन द्वारा है। माउसडाउन इवेंट माउस को कैप्चर करता है, कंट्रोल। कैप्चर प्रॉपर्टी। अंतर्निहित माउसअप इवेंट हैंडलर जांचता है कि क्या माउस अभी भी कब्जा कर लिया गया है और माउस बहुत दूर नहीं चला है, फिर क्लिक ईवेंट को निकाल देता है। समस्या यह है कि DoDragDrop() को कॉल करना माउस कैप्चर रद्द कर देगा। अनिवार्य रूप से इसलिए चूंकि माउस ईवेंट अब ड्रैग + ड्रॉप ऑपरेशन को लागू करने के लिए उपयोग किए जाते हैं। तो आपको क्लिक न करें और डबलक्लिक ईवेंट कभी नहीं मिलेगा।

नियंत्रण दोनों को क्लिक करने की आवश्यकता है और ड्रैग + ड्रॉप एक उपयोगिता समस्या है। यह ठीक करने योग्य है, हालांकि, आपको यह सुनिश्चित करना है कि उपयोगकर्ता ने माउस को मूल माउस डाउन स्थान से स्थानांतरित कर दिया है, फिर ड्रैग शुरू करें। इस तरह अपने कोड को ऐसा रूप दें:

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

धन्यवाद - माउसडाउन -> माउसमोव समाधान उचित रूप से स्पष्ट था, लेकिन मुझे SystemInformation.DoubleClickSize जानकारी से अवगत नहीं था, इसलिए यह वास्तव में सहायक है :) –

+0

"नियंत्रण जो दोनों को क्लिक और ड्रैग + ड्रॉप पर प्रतिक्रिया देने की आवश्यकता है, उपयोगिता समस्या है" । कोई भी बाएं बटन के साथ ड्रैग और ड्रॉप को संभालना चाहता है, और दायां बटन क्लिक करें। – gadjou

1
जो खींचें के साथ सी # संस्करण की जरूरत के लिए

और ड्रॉप

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

संबंधित मुद्दे