2011-06-23 7 views
10

मैं Google पर लगभग एक घंटे के लिए उत्तर ढूंढ रहा हूं लेकिन मुझे वह बिल्कुल नहीं मिला जो मैं ढूंढ रहा हूं।कस्टम तर्क के साथ EventHandler

असल में, मेरे पास एक स्थिर हेल्पर क्लास है जो मेरे ऐप में अक्सर कई चीजें करने में मदद करती है। इस मामले में, मेरे पास "CreateDataContextMenu" नामक एक विधि है जो किसी दिए गए TreeView नियंत्रण पर एक संदर्भ मेनू बनाता है।

public static void CreateDataContextMenu(Form parent, TreeView owner, string dataType) 
{ ... } 

TreeView स्वामी वह नियंत्रण है जिसमें मैं अपना संदर्भ मेनू जोड़ूंगा।

फिर बाद में मैं एक क्लिक घटना एक MenuItem को इस तरह जोड़ें:

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click); 

समस्या मैं यहाँ है कि मैं "मालिक" और "डेटाप्रकार" menuItemFolder_Click घटना के लिए तर्क के रूप में पारित करने के लिए चाहते हैं।

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType)); 
(...) 
private static void menuItemFolder_Click(object sender, System.EventArgs e, Treeview owner, string dataType) 
{...} 

लेकिन यह बिल्कुल काम नहीं करता है:

मैं निम्नलिखित की कोशिश की। यह मेरे लिए ऐसा करने के लिए बहुत मूर्खतापूर्ण हो सकता है लेकिन मैं अभी तक ईवेंट हैंडलर के साथ बहुत सहज नहीं हूं।

कोई विचार है कि मैं यह कैसे कर सकता हूं? मेरा पहला अनुमान यह है कि मुझे अपना खुद का इवेंट हैडलर बनाना है इस विशिष्ट मामले के लिए मुझे लगता है कि के साथ सही दिशा में जा रहा हूँ

+0

मालिक यहाँ नहीं Treeview के लिए एक संदर्भ होते हैं? या यह संदर्भ मेनू पर रुक जाएगा? – MPelletier

उत्तर

37

आप एक lambda expression कि अतिरिक्त पैरामीटर के साथ एक प्रणाली को बुलाती है बनाना चाहिए:।?

menuItemFolder.Click += (sender, e) => YourMethod(owner, dataType); 
+2

यह विधि एक आकर्षण की तरह काम करती है, यह छोटा और बहुत ही कुशल है। जितना अधिक मैं पूछता हूं, उतना ही मैं सीखता हूं :) आपको बहुत ज्यादा धन्यवाद! – Sasha

+0

दूर तक स्पष्ट विधि। उन लोगों के लिए जो लैम्ब्डा अभिव्यक्तियों के लिए उपयोग नहीं किए जाते हैं, मेरे जैसे, शायद यह दिखाने का एक अच्छा विचार होगा कि 'प्रेषक' और 'ई' को भी आपके मोड में पास किया जा सकता है। –

+0

एक ही घटना की सदस्यता रद्द कैसे करें? –

0

ईमानदार स्वीकारोक्ति सामने: मैं प्रयास नहीं किया है नीचे कोड।

मैं कारण लगता है

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType)); 

होगा काम नहीं है क्योंकि आप वास्तव में System.EventHandler करने के लिए() प्रदान की मानकों के साथ से गुजर रहे हैं) menuItemFolder_Click के आह्वान (का परिणाम है। आप फ़ंक्शन में पॉइंटर पास नहीं कर रहे हैं।

मेनू ItemFolder_Click() के विवरण लागू करने वाले दूसरे फ़ंक्शन को लिखने का प्रयास करें। देखें कि

private void menuItemFolder_Click_Helper (object sender, EventArgs e, object Owner, object DataType) { 
// implement details here 
} 

और फिर मेनू ItemFolder_Click() के भीतर से फ़ंक्शन को कॉल करें।

0

मुझे लगता है कि सबसे सरल कोड इस होगा:

EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate 

    myButton.Click += myEvent;//suscribe 

    private void MyMethod(MyParameterType myParameter) 
    { 
    //Do something 

    //if only one time 
    myButton.Click -= myEvent;//unsuscribe 
    }