2009-04-26 12 views
7

में बाहरी ऑब्जेक्ट की घटनाओं को बढ़ाकर actions एक पैनल है, क्या मैं Click अपने माता-पिता की घटना को बढ़ाने में सक्षम हूं? मेरे पास इस समय यह कोड है, लेकिन Click ईवेंट एक विधि नहीं है, इसलिए यह कोड अमान्य है।
क्या कोई जानता है कि मैं इसे कैसे प्राप्त कर सकता हूं?सी #

actions.Click += delegate(object Sender, EventArgs e) 
{ 
    ((Panel)Sender).Parent.Click(); 
} 

उत्तर

9

यह (भले ही public है) एक और class से सीधे एक सी # event बढ़ाने के लिए संभव नहीं है। आप एक विधि (पर्याप्त पहुंच संशोधक के साथ) प्रदान कर सकते हैं जो आपकी ओर से event उठाता है और उस विधि को अन्य class में कॉल करता है।

वैसे, यह प्रतिबिंब के साथ संभव है, लेकिन मुझे लगता है कि एक गंदे हैक।

+0

मैं एक नया पैनल वर्ग inherits पुराने बना सका सक्रिय कर देगा, और उसके बाद घटना क्लिक करें बढ़ाने के लिए एक विधि जोड़ने के आह्वान ? –

+0

हां। तुम्हें वह करना चाहिए। –

+0

क्षमा करें कि यह एक गंदे चाल नहीं है, इसकी एओपी में इसकी जगह है ताकि आप अपनी कक्षा में हर संपत्ति के लिए और आपके मॉडल को छेड़छाड़ करने की प्रक्रिया में NotifyProperty को नहीं लिख सकें। – Alwyn

1

आप जिस ढांचे का उपयोग कर रहे हैं उसके आधार पर आपको माता-पिता, WPF और ASP.NET पर क्लिक ईवेंट मैन्युअल रूप से आमंत्रित करने की आवश्यकता नहीं है उदाहरण के लिए तत्व पेड़ पर बबल ईवेंट।

यदि यह कोई विकल्प नहीं है तो आप मेहदाद की तरह सुझाव दे सकते हैं।

6

सीएलआर में अधिकांश प्रकार जो घटनाओं को बढ़ाते हैं, पर एक संरक्षित [EventName] विधि है जो घटना को बढ़ाने का ख्याल रखती है। आप प्रतिबिंब का उपयोग कर "बाहर से" इस संरक्षित विधि आह्वान कर सकते हैं:

Control parent = ((Control)sender).Parent; 
Type parentType = parent.GetType(); 
MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic); 

onClickMethod.Invoke(parent, new object[] { e }); 
1

एकमात्र कारण मैं तुम क्यों जुटाने की घटना पर क्लिक करें है अगर आप उपयोगकर्ता इनपुट अनुकरण कर रहे हैं चाहते हो जाएगा के लिए के बारे में सोच सकते हैं। क्या आप एक स्वचालित परीक्षण चालक या ऐसा कुछ काम कर रहे हैं? यदि ऐसा है, तो केवल परीक्षण सहायक विधियों के साथ कोड को जमा करने से बेहतर समाधान हो सकते हैं। This Google में पहले आता है, मुझे कोई जानकारी नहीं है कि यह अच्छा है या नहीं।

यदि आप इसे अपने आवेदन में एक तरह के प्रवाह नियंत्रण के रूप में करने की कोशिश कर रहे हैं, तो मैं यह देखने के लिए एक कदम वापस लेगा कि यह सही काम है या नहीं - यह "खराब बदबू आ रही है" ।

var link = new LinkLabel()' 
link.Text = "Some link"; 
link.click(); 

क्लिक() विधि एक सी # विस्तार विधि है::

+0

मैं क्लिक ईवेंट को बबल अप करने की कोशिश कर रहा हूं, मैं WPF का उपयोग नहीं कर रहा हूं, इसलिए यह स्वचालित रूप से नहीं होता है। –

2

मैं इस ताकि मैं सिर्फ आह्वान कर सकते हैं (इस मामले में) बस को फोन करके प्रतिबिंब और विस्तार तरीकों का उपयोग कर एक LinkLabel क्लिक करें घटना कार्यान्वित

public static void click(this LinkLabel linkLabel) 
{ 
    var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink"))); 
    linkLabel.invoke("OnLinkClicked", e); 
} 

जो करने के लिए एक और विस्तार तरीकों का उपयोग करता:

  • LinkLa से एक निजी संपत्ति प्राप्त बेल
  • (LinkLabelLinkClickedEventArgs वस्तु बनाने के लिए आवश्यक) OnLinkClicked विधि (जो घटना