2009-01-26 13 views
8

मैं कैसे कहूं कि ड्रैग ड्रॉप ने WinForms .net को समाप्त कर दिया है। ड्रैग ड्रॉप प्रगति पर होने पर मुझे डेटा के दृश्य को रीफ्रेश करने से अपने फॉर्म का हिस्सा रोकना होगा।मैं कैसे बता सकता हूं कि ड्रैग ड्रॉप Winforms में समाप्त हो गया है या नहीं?

मैंने ध्वज का उपयोग करने की कोशिश की है, लेकिन मुझे ड्रैग ड्रॉप की प्रगति के साथ ध्वज को समन्वयित रखने के लिए आवश्यक सभी घटनाओं को कैप्चर करना प्रतीत नहीं होता है। विशेष रूप से मैं यह नहीं बता सकता कि ड्रैग ड्रॉप ऑपरेशन कब ड्रैग ड्रॉप पूरा होने के बिना समाप्त होता है, यानी जब उपयोगकर्ता ड्रॉप = झूठी अनुमति के साथ आइटम को नियंत्रण में छोड़ देता है, या जब उपयोगकर्ता ईएससी कुंजी दबाता है।

मैं इस सवाल को देखा है: -

Check if a drag&drop is in progress

लेकिन इससे मेरी समस्या का संतोषजनक ढंग से समाधान नहीं करता है (अगर कोई मुझे इस सवाल का जवाब मैं जवाब के साथ कि एक के साथ एक साथ जवाब देंगे देता है मेरे पास पहले से क्या है)।

उत्तर

16

मुझे कोई लेने वाला नहीं मिला और अंत में यह पता चला।

उत्तर QueryContinueDrag ईवेंट की निगरानी करना है। ड्रैग ड्रॉप ऑपरेशन के दौरान यह घटना लगातार आग लगती है। QueryContinueDragEventArgs में enum DragAction टाइप एक्शन प्रॉपर्टी होती है, जो या तो DragAction.Cancel, DragAction.Drop या DragAction.Continue है। यह आपको मानक व्यवहार बदलने की अनुमति देने के लिए एक पठन/लेखन संपत्ति है (हमें इसकी आवश्यकता नहीं है)।

यह उदाहरण कोड मानता है ड्रैगड्रॉप प्रोग्रेस ध्वज ड्रैग ड्रॉप की शुरुआत में सेट होता है और ड्रैग ड्रॉप सफलतापूर्वक पूरा होने पर रीसेट हो जाता है। यह ड्रैगड्रॉप समाप्त होता है क्योंकि उपयोगकर्ता ने ड्रैग ड्रॉप लक्ष्य (ड्रैग ड्रॉप लक्ष्य MyControl1 और MyControl2) के बिना माउस को छोड़ दिया है या ड्रैग ड्रॉप को रद्द कर दिया है। यदि आपको ड्रैगड्रॉप ईवेंट प्रोग्राम्स की आग लगने से पहले ड्रैगड्रॉपइन प्रोग्रेसफ्लैग रीसेट कर दिया गया है तो आप परवाह नहीं है, तो आप हिट टेस्ट के साथ बांट सकते हैं और ध्वज को रीसेट कर सकते हैं।

Private Sub MyControl_QueryContinueDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.QueryContinueDragEventArgs) Handles MyControl.QueryContinueDrag 

    Dim MousePointerLocation As Point = MousePosition 

    If e.Action = DragAction.Cancel Then '' User pressed the Escape button 
     DragDropInProgressFlag = False 
    End If 

    If e.Action = DragAction.Drop Then 
     If Not HitTest(new {MyControl1, MyControl2}, MousePointerLocation) Then 
      DragDropInProgressFlag = False 
     End If 
    End If 

End Sub 

Private Function HitTest(ByVal ctls() As Control, ByVal p As Point) As Boolean 

    HitTest = False 

    For Each ctl In ctls 
     Dim ClientPoint As Point = ctl.PointToClient(p) 
     HitTest = HitTest Or (ClientPoint.X >= 0 AndAlso ClientPoint.Y >= 0 AndAlso ClientPoint.X <= ctl.Width AndAlso ClientPoint.Y <= ctl.Height) 
     If HitTest Then Exit For 
    Next 

End Function 

इस उदाहरण hitTest में एक rountine माउस स्थिति नियंत्रण आयतों में से किसी में है अगर यह सच है कि सरणी गुजर के माध्यम से एक माउस स्थिति (स्क्रीन समन्वय) और नियंत्रण की एक सरणी लेता है और sifts है।

+0

आप बहुत अच्छे हैं! विशिष्ट नियंत्रणों पर हिट टेस्ट के लिए मुझे एक अच्छा कार्यान्वयन के साथ वास्तव में क्या चाहिए। चतुर। – AMissico

+0

अगर clt.ClientRectangle.Contains (ClientPoint) तो: HitTest = True: इसके लिए बाहर निकलें: अंत यदि – AMissico

+0

: लाइन ब्रेक दिखाने के लिए जोड़ा गया है (भले ही कथन दिखाया गया हो)। – AMissico

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

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