2010-07-22 11 views
34

मेरे पास एक कस्टम नियंत्रण में एक combobox है। मैं अपने कस्टम नियंत्रण को लागू करने वाले किसी भी चीज़/चीज़ को चुनिंदा इंडेक्स चेंज या कीप्रेस इत्यादि से विशिष्ट घटनाओं का खुलासा कैसे कर सकता हूं?अंतर्निहित नियंत्रण की घटनाओं का खुलासा

उत्तर

73

आप इस तरह की घटनाओं अग्रेषित कर सकते हैं।:

public event EventHandler SelectedIndexChanged 
    { 
     add { inner.SelectedIndexChanged += value; } 
     remove { inner.SelectedIndexChanged -= value; } 
    } 
+0

अच्छा, नहीं पता था कि इस तरह के एक वाक्य रचना सी # में घटनाओं के लिए उपलब्ध था। तो आप इवेंट हैंडलर असाइनमेंट और हटाने के लिए अनुमान लगाते हुए साइड इफेक्ट्स भी जोड़ सकते हैं (उदाहरण के लिए यदि आप उन्हें स्वयं को संभालना/बनाए रखना चाहते हैं या COM या देशी कोड या हार्डवेयर के साथ कुछ भी करने की आवश्यकता है तो ये हो) –

+4

आपको आवश्यकता है इस के साथ सावधान रहना क्योंकि घटना के प्रेषक बाहरी नियंत्रण नहीं बल्कि आंतरिक हैं। यह इरादा हो सकता है लेकिन ऐसे मामले हैं जहां यह अवांछित हो सकता है। – GDS

+0

यह एक combobox के चयनित इंडेक्स चेंज के लिए ठीक काम कर सकता है लेकिन किसी अन्य ईवेंट के लिए काम करने के लिए थोड़ा और कोड लेता है जैसे चेकबॉक्स की चेकड चेंज। उपरोक्त के समान कोड का उपयोग करने से आपको मूल्य के निकट वाक्यविन्यास मिल जाएगा जबकि उत्तर # 2 ऐसे मामलों के लिए बेहतर काम कर सकता है – gg89

3

आपको इन्हें स्वयं नियंत्रण में कोड करने की आवश्यकता होगी - उपयोगकर्ता नियंत्रण स्वचालित रूप से अपने बाल नियंत्रण की घटनाओं को बढ़ावा नहीं देता है। इसके बाद आप पार तार उपयोगकर्ता नियंत्रण के पदोन्नत घटना के लिए अपने वास्तविक नियंत्रण कर सकते हैं:

 public event EventHandler SelectedIndexChanged; 

     private void OnSelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (SelectedIndexChanged != null) 
       SelectedIndexChanged(sender, e); 
     } 

     public UserControl1() 
     { 
      InitializeComponent(); 

      cb.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged); 
     } 

दुर्भाग्य से आप हर घटना आप में रुचि रखते हैं के लिए यह करने के लिए की आवश्यकता होगी

2

बल्कि होने कस्टम घटनाओं की तुलना में एक बहुत ही सरल समाधान, कस्टम नियंत्रण के एक संपत्ति के रूप में नेस्टेड नियंत्रण बेनकाब करने के लिए किया जाएगा। वहां से आप ईवेंट हैंडलर को बहुत आसानी से संलग्न कर सकते हैं। बाल नियंत्रण का पर्दाफाश करने के लिए हमेशा सलाह नहीं दी जाती है, लेकिन नियंत्रण प्रकार और आप इसका उपयोग कैसे कर रहे हैं, यह काम कर सकती है।

डिजाइनर पर, आपके कस्टम नियंत्रण में, के तहत "डिजाइन" सेट "संशोधक" बता गया संपत्ति आंतरिक करने पर:

//create an instance of my control 
MyCustomControl controlInstance = new MyCustomControl(); 

//attach and event handler to the exposed subcontrol 
controlInstance.SaveButton.Click += new EventHandler(SaveButton_Click); 
+3

को बुलाया गया है यह गलत नहीं है, लेकिन उन पाठकों के लिए कस्टम उपयोगकर्ता नियंत्रण बनाने में अच्छी तरह से ज्ञात नहीं है, यह ध्यान दिया जाना चाहिए कि इनमें से एक बाल नियंत्रण का पर्दाफाश करने के लिए सलाह देने के कारण यह नहीं है कि यह उपयोगकर्ता नियंत्रण के भीतर कार्यक्षमता का एक पूर्ण टुकड़ा encapsulating के उद्देश्य से अधिक उद्देश्य को हरा देता है। पूरे बाल नियंत्रण को उजागर करके आप वास्तव में उपयोगकर्ता नियंत्रण उपभोक्ता को बाल नियंत्रण में हेरफेर करने के लिए प्रोत्साहित करते हैं। इसके बजाए, पूरे उपयोगकर्ता नियंत्रण के बजाए, अपने उपयोगकर्ता नियंत्रण के उपभोक्ताओं द्वारा पूरी तरह से आवश्यक एक या दो घटनाओं को उजागर करने का प्रयास करें। – CobaltBlue

0

एक और तरीका है डिजाइनर के माध्यम से है कि संभाल करने के लिए नहीं है।

तो जहां कुछ करने के लिए की जरूरत के बारे में जोड़ें:

CustControlName.YourCombo.SelectedIndexChanged += YourCombo_SelectedIndexChanged; 

के साथ:

private void YourCombo_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Code to execute when the SelectedIndexIsChanged goes here 
} 
+0

थोड़ा और आसानी से काम करता है लेकिन अभी भी टिप्पणी फ़ॉर्म कोबाल्टब्लू के अधीन है – gg89

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