(1) यह नियंत्रित करने के लिए कि घटक को केवल एक फॉर्म में जोड़ा जा सकता है, FooComponent
कन्स्ट्रक्टर का उपयोग करें जो एक फॉर्म पास हो गया है, और डिफ़ॉल्ट कन्स्ट्रक्टर को परिभाषित नहीं करता है। इसे इस तरह कहा जाता है:
FooComponent component = new FooComponent(this);
जहां घटक स्वयं फॉर्म के भीतर से बनाया गया है। डिफ़ॉल्ट कन्स्ट्रक्टर को परिभाषित नहीं करके, यह:
FooComponent component = new FooComponent();
संकलित नहीं होगा।
(2) प्रपत्र पर ही एक FooComponent
संपत्ति पर्दाफाश, और FooComponent
के निर्माता में, सेट पारित कर दिया प्रपत्र के FooComponent
this
करने के लिए।
(3) यही बात, FooComponent
के लिए निर्माता में, प्रपत्र आप
पारित कर दिया के लिए समापन समारोह के साथ रजिस्टर
यह सब एक साथ रखो और आपको मिलता है:
public class MyForm : Form {
public FooComponent OwnedComponent { get; set; }
}
public class FooComponent {
public FooComponent (MyForm OwnerForm) {
OwnerForm.OwnedComponent = this;
OwnerForm.FormClosing += MyCallback;
}
private void MyCallback(object sender, FormClosingEventArgs e) {
...
}
}
EDIT
दुर्भाग्यवश, यदि आपको वांछित है ई डिफ़ॉल्ट कन्स्ट्रक्टर, और यदि इसे एक वास्तविक ड्रॉप-ऑन-द-फॉर्म घटक होना है, तो यह लागू करने का कोई तरीका नहीं है कि एक घटक केवल एक फॉर्म पर बनाया गया है, या फ़ॉर्म में केवल घटक का एक उदाहरण है (से नहीं घटक के भीतर, वैसे भी)।
समस्या दोहरा है:
(1) एक घटक फार्म के लिए घटक शामिल नहीं करता गिराने, यह प्रपत्र के components
संग्रह करने के लिए कहते हैं। तो अगर आप माता-पिता/मालिक को हैंडल प्राप्त कर सकते हैं, तो यह कभी भी एक फॉर्म नहीं होगा।
(2) जैसा कि नील ने इंगित किया है, एक फॉर्म पर एक घटक छोड़ना डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है, जो कोई पैरामीटर नहीं पास करता है, और, ज़ाहिर है, घटक के गुणों (जैसे साइट या कंटेनर) में से कोई भी पॉप्युलेट नहीं होता है।
संभवतः सहायक: एक घटक जब यह कई तरीकों से में बन जाता है अधिसूचित करने के लिए डिज़ाइन किया जा सकता है:
(1) एक निर्माता है कि एक IContainer
पैरामीटर लेता है को लागू करने से। जब घटक को किसी फॉर्म पर गिरा दिया जाता है, तो जेनरेट कोड इसके बजाय इस कन्स्ट्रक्टर को कॉल करेगा। हालांकि, यह केवल रनटाइम पर ही करेगा, डिजाइन समय नहीं। लेकिन कंटेनर फॉर्म के components
संग्रह के लिए एक हैंडल होगा।
public FooComponent(IContainer container) {...}
(2) ISupportInitialize
लागू करके। जब घटक को किसी रूप पर गिरा दिया जाता है, तो जेनरेट कोड अतिरिक्त रूप से BeginInit()
और EndInit()
पर कॉल करेगा। EndInit()
में, आप Site
और Container
जैसे गुणों तक पहुंच सकते हैं। दोबारा, आप इसे केवल रनटाइम पर प्राप्त करेंगे, डिज़ाइनटाइम नहीं, और यहां अपवाद फेंकने से घटक को बनाए जाने से नहीं रोका जाएगा।
पुराने, लेकिन MSDN Magazine से माइकल वेनहार्ड और क्रिस सेल द्वारा घटक और नियंत्रण पर उत्कृष्ट लेख।
April 2003 Building Windows Forms Controls and Components with Rich Design-Time Features
May 2003 Building Windows Forms Controls and Components with Rich Design-Time Features, Part 2
ये अब .chm मदद फ़ाइलें हैं। डाउनलोड करने के बाद सामग्री को पढ़ने में सक्षम होने के लिए आपको फ़ाइल के प्रॉपर्टी पेज में अनब्लॉक करना होगा।
मुझे लगता है कि आप CodeDomSerializer (http://msdn.microsoft.com/en-us/library/system.componentmodel.design.serialization.codedomserializer.aspx) देख सकते हैं। यह तुम्हारा सबसे अच्छा शर्त हो सकता है। – PHeiberg
@PHeiberg: धन्यवाद –