2011-11-08 14 views
6

में इवेंट हैंडलर मैं सी # के लिए नया हूं, अगर यह नोब सवाल है तो क्षमा करें। मैं सी # में घटनाओं को संभालने के लिए वाक्यविन्यास या पैटर्न के चारों ओर स्पष्टता प्राप्त करने की कोशिश कर रहा हूं।सी # - सिंटैक्स/पैटर्न

तो मेरे पास Form ऑब्जेक्ट Form1 और Button button1 फ़ॉर्म में है। मैं Form1.cs में इस तरह की एक विधि के साथ एक क्लिक घटना संभाल:

private void button1_Click(object sender, EventArgs e) 
{ 
    Debug.WriteLine("click!"); 
} 

जो ठीक काम करता है। अब एक और रूप में Form2 मेरे पास TreeView treeView1 है, और मैं BeforeExpand ईवेंट को संभालना चाहता हूं। तो मैं मान लिया है यह होगा:

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    Debug.WriteLine("Hello!"); 
} 

जो वास्तव में काम नहीं करता है: जब मैं एक नोड का विस्तार इस विधि कहा जाता है कभी नहीं है। लेकिन कई SO जवाब इस को करने का तरीका है, उदाहरण के लिए यह one है।

वैसे भी मुझे एक वैकल्पिक दृष्टिकोण मिला जो मेरे लिए काम करता है। फॉर्म कन्स्ट्रक्टर में इवेंट हैंडलर को इस तरह से बांधें:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike); 

तो इन दो दृष्टिकोणों के बीच क्या अंतर है? _event वाक्यविन्यास एक वृक्षदृश्य के लिए क्यों काम नहीं करता है? घटना प्रकारों के बीच कुछ अंतर है?

धन्यवाद

+1

तो मुझे इस सीधे मिलता है: संस्करण है कि आप बस संचालक को परिभाषित कर रहे काम नहीं करता है में और फिर? आप उस संस्करण में बाध्यकारी नहीं हैं? – Tudor

उत्तर

5

मुझे लगता है कि आपने विजुअल स्टूडियो डिजाइनर में बटन को डबलक्लिक किया है। button1_Click हैंडलर स्वचालित रूप से जोड़ा गया है, जैसे आपने BeforeExpand हैंडलर हाथ से बनाया है।

अपने Form1.Designer.cs फ़ाइल की जाँच करें, तो आप इस तरह की एक पंक्ति कुछ मिल जाएगा:

this.button1.Click += new System.EventHandler(this.button1_Click); 
+0

ठीक है हाँ यह सही है। मेरे पास वास्तव में Designer.cs में यह पंक्ति है। अब समझ में आता है :) –

4

आपके पास क्या सही है। जैसा कि आपने दूसरे मामले में किया है, आपको ईवेंट में हैंडलर जोड़ना होगा।

button1.Click += button1_Click; 

(संभवतः एक new EventHandler() आवरण के साथ) अपने Form1 कोड में कहीं, सबसे शायद .designer.cs फ़ाइल में:

इस तरह एक लाइन होनी चाहिए।

+0

आह हे हाँ वहाँ है। धन्यवाद वीएम –

1

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

यदि आप फॉर्म 1 की जांच करते हैं, और बटन का चयन करें और इसकी घटनाओं को देखने के लिए क्लिक करें, तो यह कार्यक्रम डिजाइनर के माध्यम से सबसे अधिक संभावना है। आप डिजाइनर के माध्यम से ट्री व्यू के साथ अपने फॉर्म पर भी ऐसा ही कर सकते हैं।

0

किसी ईवेंट की सदस्यता लेने का यह सही तरीका है। जब आप इसके माध्यम से ईवेंट की सदस्यता लेते हैं तो डिज़ाइनर स्वचालित रूप से .designer.cs फ़ाइल में उस पंक्ति को जोड़ता है।

किसी भी तरह से, कोड की यह पंक्ति कहीं भी लिखी जा रही है। अंतर यह है कि डिज़ाइनर के माध्यम से एक ईवेंट की सदस्यता ली जा रही है, जबकि दूसरा आप मैन्युअल रूप से सदस्यता ले रहे हैं।

1

सी # इवेंट हैंडलिंग सिस्टम किसी भी प्रकार के नामकरण सम्मेलन पर काम नहीं करता है (मुझे लगता है कि आप इस मामले में विश्वास कर सकते हैं?)।एक विधि treeView1_BeforeExpand बुलाया treeview1 के BeforeExpand घटना पर बुलाया नहीं की जाएगी जब तक आप इसे उस विशिष्ट घटना पर कि विधि कॉल करने के।

नीचे कोड "जब BeforeExpand घटना निकाल दिया जाता है, anyMethodNameYouLike विधि आह्वान।

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike); 

आप अपने anyMethodNameYouLike विधि लिखने के लिए की है।

1

यह link आप यह पता लगाने कैसे स्थापित करने के लिए मदद करनी चाहिए कहते हैं

+0

बहुत बढ़िया धन्यवाद! –

1

WinForms में अपने फार्म डिजाइनर में विशिष्ट घटनाओं के लिए विशिष्ट ईवेंट हैंडलर्स।, आप "गुण" टूलबॉक्स का उपयोग करने और शीर्ष पर बिजली बटन पर क्लिक। हो जाएगा ताकि डिजाइनर से ईवेंट हैंडलर्स बाध्य कर सकते हैं घटना टैब खोलें। बस किसी ईवेंट के नाम पर डबल क्लिक करें अपने कोड में किसी हैंडलर उत्पन्न या ड्रॉप-डाउन से सही हस्ताक्षर के साथ एक मौजूदा विधि चुनने के लिए। यह वास्तव में .designer फ़ाइल में आपके लिए "+ =" कोड उत्पन्न करेगा।

नाम Control_Event स्वचालित रूप से उत्पन्न होता है। हालांकि, आप अपने हैंडलर के लिए किसी भी नाम का उपयोग कर सकते हैं और यहां तक ​​कि एक से अधिक रजिस्टर भी कर सकते हैं।
1) एक विधि है कि प्रश्न में घटना के प्रकार संभाल कर सकते हैं:

+0

टिप वी उपयोगी –

+0

कोई समस्या नहीं है के लिए धन्यवाद। लोग कहीं भी इस टैब के बारे में बात नहीं करते हैं। जब मैं WinForms के साथ शुरू हुआ, मैं लगभग 6 महीने निर्माता में अपने सभी संचालकों को जोड़ने खर्च इससे पहले कि मैं इस एक में पता चला! –

5

आप दोनों बातें की जरूरत है। एक TreeViewCancelEventHandler (MSDN) प्रतिनिधि के लिए सही विधि हस्ताक्षर है:

public void MyMethodNameGoesHere(Object sender,TreeViewCancelEventArgs e) 
{ 
    // do some impressive stuff here 
} 

2) आप घटना के लिए पंजीकरण करना:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(MyMethodNameGoesHere); 

आप, साथ ही विधि नाम इस्तेमाल कर सकते हैं :

treeView1.BeforeExpand += MyMethodNameGoesHere; 

और एक के रूप में पिछले विकल्प आप छोटे कार्यों के लिए इस 'इनलाइन' सिंटैक्स का उपयोग हो सकता है:

treeView1.BeforeExpand += (sender, e) => 
{ 
    // do a bit of magic here 
}; 

क्या संभवतः पता करने के लिए अच्छा है कि हैंडलर पंजीकरण नहीं 'ढेर' (गरीब शब्दों के लिए खेद है, सुधार के लिए सुझाव करते हैं बहुत स्वागत है!)। अर्थ आप करते हैं जब निम्न आप करेंगे आगे की घटनाओं प्राप्त नहीं के बाद अंतिम पंक्ति निष्पादित किया गया है:

treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand -= MyMethodNameGoesHere; // note the MINUS sign 
+0

एक वी व्यापक उत्तर के लिए धन्यवाद –