2008-10-03 8 views
57

मेरे पास एक कक्षा है जो UserControl लागू करती है।मैं सी # UserControl में कार्यक्षमता का निपटान कैसे जोड़ूं?

protected override void Dispose(bool disposing) 
    { 
    if (disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing); 
    } 

मैं अपने खुद के निपटान कार्यक्षमता जोड़ने के लिए चाहते हैं, तो मैं इसे जहां डाल: .NET 2005 में, एक निपटान प्रक्रिया स्वतः ही MyClass.Designer.cs आंशिक वर्ग फ़ाइल है कि इस तरह दिखता है में बन जाता है? चूंकि यह फ़ाइल जेनरेट की गई है, इसलिए मैं यहां कोड जोड़ना नहीं चाहता हूं और इसे उड़ाने का जोखिम उठाना चाहता हूं।

उत्तर

49

ऐसे मामले में मैं जेनरेट की गई Dispose विधि को मुख्य फ़ाइल में ले जाता हूं और इसे बढ़ाता हूं। विजुअल स्टूडियो इसका सम्मान करता है।

एक अन्य दृष्टिकोण आंशिक विधि (सी # 3.0) का उपयोग करेगा।

+3

इस परिदृश्य में एक आंशिक विधि काम नहीं करती है। – Micah

+0

डिज़ाइनर फ़ाइल में निपटान विधि को आंशिक विधि में कॉल शामिल करने के लिए बढ़ाया जा सकता है, जिसे मुख्य फ़ाइल में कार्यान्वित किया जा सकता है। –

+9

MyClass.Designer.cs फ़ाइल पहले से ही आंशिक फ़ाइल है, इसलिए आप पहले से जेनरेट की गई विधि को आवश्यक तर्क जोड़ सकते हैं। विजुअल स्टूडियो विधि बनने के बाद विधि को ओवरराइट नहीं करेगा, इसलिए आप इसे संशोधित करने के लिए सुरक्षित हैं। –

7

मुझे विश्वास है कि इस मामले में कोड जनरेटर आपके कोड का सम्मान करता है। इसे कोडबेंड में रखना सुरक्षित होना चाहिए।

6

वीएस 2005 (और 2008) में आप Dispose विधि अपडेट कर सकते हैं और जब आप डिज़ाइनर से नियंत्रण संपादित करते हैं तो इसे हटाया नहीं जाएगा।

2

यदि आप चाहें तो इसे .designer.cs फ़ाइल से और मुख्य .cs फ़ाइल में स्थानांतरित कर सकते हैं। जैसा कि पहले से ही कहा गया है, यह अधिलेखित नहीं किया जाएगा।

63

सभी Component कक्षाएं Disposed ईवेंट लागू करती हैं। आप उस घटना के लिए एक ईवेंट हैंडलर जोड़ सकते हैं और वहां चीजों को साफ कर सकते हैं।

उदाहरण के लिए, अपने UserControl आप निम्नलिखित जोड़ सकता है विधि में:

Disposed += OnDispose; 
+2

@ जैकोब सेलेज़नेव: यह सुनिश्चित नहीं है कि अधिक लोगों ने इसे क्यों नहीं बढ़ाया। शायद वे इसे नहीं देखा? मैं विवादित घटना को किसी भी वर्ग में निपटान कार्यक्षमता जोड़ने का उचित तरीका मानता हूं जो इसका समर्थन करता है। – supercat

+1

+1 - मैं सुपरकैट से सहमत हूं कि यह वर्तमान स्वीकृत उत्तर से बेहतर है। – Joe

+4

मेरा मानना ​​है कि, घटनाओं को कक्षा के बाहर से संभाला जाना चाहिए, न कि अंदर से। मुझे लगता है कि कोई भी ईवेंट हैंडलर को अपने आप से ओवरराइट कर सकता है और संसाधनों को मुक्त होने से रोक सकता है। नियंत्रण के आंतरिक मामलों को संभालने का उचित तरीका बेस क्लास द्वारा प्रदान की गई उचित वर्चुअल विधि को ओवरराइड करना है। – Spook

2

तुम बस ओवरलोड की जरूरत है:

private void OnDispose(object sender, EventArgs e) 
{ 
    // do stuff on dispose 
} 

और निर्माता में (या Load ईवेंट हैंडलर में) निम्नलिखित पंक्ति जोड़ उपयोगकर्ता नियंत्रण को प्राप्त करने वाले घटक वर्ग में सार्वजनिक शून्य निपटान() विधि।

सुनिश्चित करें कि आप के साथ ही आधार विधि करने के लिए कॉल पारित कार्यात्मक अपने निपटाने कर या जब तक आप पूरी तरह से लागू यह

+1

यह एक अच्छा विचार है। 'System.Windows.Forms.Control' के प्रत्येक माइक्रोसॉफ्ट-कार्यान्वित उप-वर्ग के लिए आपको 'निपटान (बूल निपटान)' पर अधिक नियंत्रण की आवश्यकता है, आप इसे उपclass कर सकते हैं और वहां 'निपटान' ओवरराइड कर सकते हैं, कुछ आभासी 'DisposeCore' [अन्य प्रश्न के उत्तर] में वर्णित विधि (http://stackoverflow.com/a/673304/429091)। आप 'डिस्पोजेइंग' पैरामीटर के मान को पढ़ सकते हैं * और * अभी भी डिजाइनर फ़ाइलों को संपादित करने से बचें। जीत/जीत। – binki

-2

वहाँ UserControl कि आप के लिए उपयोग कर सकते हैं के लिए एक उतार घटना है आप कार्यक्षमता निकाल लेंगे बनाने साफ करें,

+3

यह प्रश्न WinForms UserControl के बारे में है, जो * 'अनलोडेड 'ईवेंट नहीं है। शायद आप एक डब्ल्यूपीएफ या सिल्वरलाइट नियंत्रण का मतलब है? –

0

मुझे लगता है कि आपका नियंत्रण अपने स्वयं के विस्थापित() ईवेंट की सदस्यता लेने का सबसे साफ तरीका होगा और वहां आपका क्लीनअप करें।

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