2011-05-19 20 views
7

मैं बटन, टेक्स्टबॉक्स, आदि जैसे नियंत्रण को डुप्लिकेट करना चाहता हूं लेकिन मुझे नहीं पता कि मैं ईवेंट हैंडलर विधियों (जैसे Click) को नए नियंत्रण में कैसे कॉपी कर सकता हूं।रन ईवेंट पर नियंत्रण ईवेंट हैंडलर क्लोन कैसे करें?

मैं अब निम्नलिखित कोड:

var btn2 = new Button(); 
btn2.Text = btn1.Text; 
btn2.size = btn1.size; 
// ... 
btn2.Click ??? btn1.Click 

वहाँ एक नियंत्रण नकल करने में किसी भी अन्य रास्ता नहीं है?

+0

सुनिश्चित नहीं है कि आप डुप्लिकेट क्यों करना चाहते हैं, लेकिन एक साधारण प्रतिलिपि नियंत्रण का एक नया उदाहरण बनायेगी। –

+0

क्या आप रन टाइम पर लेट्स बटन का डुप्लिकेट बनाना चाहते हैं? पिछले ईवेंट के समान ईवेंट हैंडलर के साथ? –

+0

@ हरिस हसन: हाँ, मैं करता हूं। – mrbm

उत्तर

12

सभी घटनाओं को क्लोन करने के लिए के लिए कोई जरूरत नहीं है किसी भी WinForms नियंत्रण:

var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance); 
var eventHandlerList = eventsField.GetValue(button1); 
eventsField.SetValue(button2, eventHandlerList); 
+0

एचआरएम, शायद। लेकिन क्या यह कहीं दस्तावेज है? क्या "घटनाओं" को अनंत काल तक उस क्षेत्र का नाम होने की गारंटी है? इसके अलावा, समाधान [यहां] (http://www.codeproject.com/KB/cs/DelegateFromEvent.aspx) के समान दिखता है। –

+0

बहुत बहुत धन्यवाद !!! – mrbm

+0

@ कोडी - यह .NET 2, 3.5 और 4 में काम करता है। क्या यह बाद में काम करेगा - कोई भी नहीं जानता। क्या यह एक हैक है? हाँ यही है। –

0

मुझे समझ में नहीं आया कि आप सही तरीके से सवाल करते हैं। आप एक घटना को इस तरह के कई नियंत्रणों में संलग्न कर सकते हैं।

Button1.Click += button_click; 
Button2.Click += button_click; 
+0

हां अब, मुझे लगता है कि मुझे "बटन_क्लिक" फ़ंक्शन नहीं पता है, मेरे पास अभी बटन 1 है और मैं क्लिक ईवेंट से जुड़े कार्यों को प्राप्त करना चाहता हूं। – mrbm

+0

तब मुझे लगता है कि आपको Button.PerformClick() विधि को कॉल करने की आवश्यकता है। यह संबंधित क्लिक घटना निष्पादित करेगा। – Anuraj

+0

हां यह अच्छा है, लेकिन मैं इसे सीधे उपयोग नहीं कर सकता, btn2.Click + = new EventHandler (btn1.PerformClick); त्रुटि >> 'PerformClick' मैचों के लिए कोई ओवरलोड नहीं है 'System.EventHandler' – mrbm

5

आपको नए बटन नियंत्रण के लिए केवल add the event handler विधि की आवश्यकता है। ऐसा करने के लिए सी # += ऑपरेटर का उपयोग करता है। तो आप बस लिख सकते हैं:

btn2.Click += btn1_Click 

वैकल्पिक रूप से, कुछ हद तक एक अधिक शक्तिशाली दृष्टिकोण use reflection है। विशेष रूप से उपयोग EventInfo.AddEventHandler method होगा।

+3

लेकिन मुझे डुप्लिकेट नियंत्रण चाहिए और मुझे "btn1_Click" फ़ंक्शन – mrbm

+0

@mrbm नहीं पता: जैसा कि मैंने विमवक 1 9 87 के उत्तर में टिप्पणी में उल्लेख किया है, अगर आप ' रन-टाइम पर इवेंट हैंडलर विधि का नाम पता नहीं है, आपको प्रतिबिंब का उपयोग करने की आवश्यकता होगी। यह थोड़ा और जटिल है, लेकिन अधिक शक्तिशाली है। मेरे द्वारा प्रदान किए गए लिंक में पूर्ण नमूना कोड है। –

-5

बेहतर दृष्टिकोण एक घटक वर्ग का उपयोग कर और उस क्लास

public class DuplicateButton : OrginalButton 
{ 

} 

आप आंशिक वर्ग में परिवर्तन कर सकते हैं करने के लिए नियंत्रण के वारिस है तो बनाने की घटनाओं

+0

मुझे ऐसा नहीं लगता है। ईवेंट बटन के एक उदाहरण से जुड़ा हुआ है, कक्षा नहीं। विरासत सिर्फ काम नहीं करती है, इस मामले में – Vimvq1987

+0

मैं नियंत्रण को डुप्लिकेट करना चाहता हूं, कक्षा नहीं! – mrbm

+1

इस प्रश्न के साथ क्या करना है? –

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