2009-07-22 10 views
7

मैं ड्रैग लक्ष्य नियंत्रण को ड्रैगएन्टर और ड्रैगलेव घटनाओं के दौरान खुद को फिर से निकालने के लिए ट्रिगर करना चाहता हूं (या तो अमान्य या रीफ्रेश के माध्यम से)।ड्रैग और ड्रॉप के दौरान रीड्रॉइंग

protected override void OnDragEnter (DragEventArgs drgargs) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = true; 
    this.Refresh(); //-- Does nothing???  
} 

protected override void OnDragLeave (EventArgs e) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = false; 
    this.Refresh(); //-- Does nothing???  
} 

यह वास्तव में नियंत्रण पुनः बनाने नहीं करता है, OnPaint विधि इन घटनाओं के भीतर ताज़ा() से बुलाया नहीं है: कोड की तरह कुछ लग रहा है। क्या इसे करने का कोई तरीका है? मुझे यहाँ कुछ समझना नहीं चाहिए।

अद्यतन: जेसन द्वारा प्रदान किया गया उत्तर वास्तव में काम नहीं करता है। अमान्य() या अमान्य (rect) का उपयोग करते समय नियंत्रण वास्तव में अद्यतन नहीं होता है। यह के दौरान एक ड्रैग और ड्रॉप एक्शन के दौरान कॉल किया जा रहा है। कोई अन्य विचार? क्या आप पर के दौरान एक ड्रैग और ड्रॉप के नियंत्रण को फिर से शुरू कर सकते हैं? धन्यवाद!

अद्यतन 2: मैं एक नमूना प्रोजेक्ट बनाया है और इस नहीं काम करने के लिए नहीं मिल सका। Sigh ... अंततः मैं OnPaint में कुछ कोड के लिए इसे ट्रैक किया जो समस्या पैदा कर रहा था। तो, यह मेरे बारे में अधिक नहीं समझ पाया कि डीबगर ने कैसे काम किया (यह कभी भी ऑनपेंट में ब्रेक पॉइंट नहीं मारा ... अभी भी क्यों नहीं पता)। अमान्य(), ताज़ा करें() दोनों काम करते हैं। जेसनएच को जवाब मिल गया क्योंकि यह अंततः सही था और यह भी दिखाया गया कि नियंत्रण के केवल एक हिस्से को कैसे अमान्य करना है ... मुझे इसके बारे में पता नहीं था।

आपकी सभी मदद के लिए धन्यवाद!

+0

मेरा अनुमान है कि आपने AllowDrop को सत्य पर सेट नहीं किया है। – jasonh

+0

हां, AllowDrop सत्य पर सेट है। ड्रैग-एंड-ड्रॉप हो रहा है। बस नियंत्रण की पुनरावृत्ति नहीं है (ऑनपेंट को अमान्य() या रीफ्रेश() के बाद नहीं कहा जाता है। –

उत्तर

4

कॉल this.Invalidate() पर कॉल/नियंत्रण को खुद को फिर से निकालने के लिए कॉल करें। यदि आप विशिष्ट क्षेत्र को जानते हैं, तो निर्दिष्ट करने के लिए ओवरलोड किए गए तरीकों में से एक को कॉल करें। उदाहरण के लिए:

Rectangle toInvalidate = new Rectangle(drgargs.X - 50, drgargs.Y - 50, 50, 50); 
this.Invalidate(toInvalidate); 

जो ड्रैग लक्ष्य क्षेत्र के आस-पास के क्षेत्र के 50 पिक्सेल को अमान्य कर देगा।

+2

यह काम नहीं किया। सवाल विशेष रूप से ड्रैग-एन-ड्रॉप ईवेंट के दौरान ऐसा करने के बारे में था। यदि यह आपके लिए काम करता है, तो कुछ ऐसा होना चाहिए जो मैं गलत कर रहा हूं ... ... –

+1

यह सुनिश्चित नहीं है कि मुझे क्यों कम किया जा रहा है, क्योंकि अमान्येट ठीक वही करता है जो इसे माना जाता है। – jasonh

+0

सुनिश्चित करें कि UserControl में AllowDrop प्रॉपर्टी को सत्य पर सेट किया गया है।मैंने इसे एक सरल प्रोजेक्ट में परीक्षण किया है जिसमें स्ट्रिंग को नियंत्रण में खींचा जा रहा है और यह नियंत्रण में खींच रहा है या नहीं, इस पर आधारित रंग (जो मैं परीक्षण कर रहा हूं) बदलता हूं। क्या आप ऐसी परियोजना का एक उदाहरण पोस्ट कर सकते हैं जो काम नहीं करता है, इसलिए मैं इसे ठीक करने में आपकी सहायता कर सकता हूं? – jasonh

2

वहाँ तीन प्रतीत होता है लागू यहाँ तरीके हैं:

Control.Invalidate() -, repainting की जरूरत होती ही नियंत्रण (क्षेत्र, या आयत) के निशान है, लेकिन repainting के लिए मजबूर नहीं है जब सब कुछ है रीपेंट शुरू हो रहा है का ख्याल रखा गया और ऐप निष्क्रिय हो गया।

Control.Update() - किसी भी भाग अवैध होने पर नियंत्रण को तत्काल पुनर्निर्मित करने का कारण बनता है।

Control.Refresh() - नियंत्रण को अमान्य करने का कारण बनता है, और उसके बाद अद्यतन (तुरंत खुद को पुनर्निर्मित करें)।

तो, ताज़ा करें() सही दृष्टिकोण है। मैं क्या करूँगा रीफ्रेश विधि कॉल पर ब्रेकपॉइंट सेट करें और देखें कि यह कब/कब मारा जा रहा है।

+0

इसे मारा जा रहा है। यह निष्पादित करता है, लेकिन वास्तव में ऑनपेंट को बुलाया नहीं जाता है। –

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