2009-12-21 6 views
10

मैं थोड़ा उलझन में हूँ। मुझे पता है कि कस्टम इवेंट डेटा रखने के लिए मैं EventArgs से व्युत्पन्न कक्षा बना सकता हूं। लेकिन क्या मैं किसी भी तरह बेस क्लास EventArgs को नियोजित कर सकता हूं? माउस बटन की तरह, ग्राहक विधि में क्लिक करें, हमेशा "EventArgs e" पैरामीटर होता है। क्या मैं किसी भी तरह से विधि बना सकता हूं जो इस तरह से डेटा पास करेगा, मेरा मतलब है कि वे बेस इवेंटग्स में पारित हो जाएंगे?व्युत्पन्न कक्षा के निर्माण के बिना EventArgs पर डेटा पास करना संभव है?

+0

पास करने वाला इवेंट हैंडलर बनाएं यदि आप डेटा को पिगबैक करने का प्रयास कर रहे हैं माउस क्लिक इवेंट, न केवल आप ऐसा नहीं कर सकते हैं, यह इंगित करता है कि आपके डिज़ाइन के साथ कोई समस्या है। – Will

+1

यह स्पष्ट करने का कोई मौका क्यों यह एक डिजाइन समस्या है? क्या मेनू को बटनों के ढेर के रूप में अर्थपूर्ण रूप से नहीं देखा जा सकता है, जिसमें से संबंधित घटना आपको यह पूछने की अनुमति देती है कि मेनू में कौन सा 'बटन' दबाया गया था? एक बटन क्लिक के साथ अतिरिक्त जानकारी पास करने के इच्छुक द्वारा आप किस डिजाइन सिद्धांत को तोड़ रहे हैं? – Patrick

उत्तर

3

क्या EventArgs डेटाटाइप कच्चे का उपयोग करना संभव है? पूर्ण रूप से। MSDN के अनुसार:

This class contains no event data; it is used by events that do not pass state information to an event handler when an event is raised. If the event handler requires state information, the application must derive a class from this class to hold the data.

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

private event TestEventEventHandler TestEvent; 
    private delegate void TestEventEventHandler(EventArgs e); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     TestEvent += TestEventHandler; 
     if (TestEvent != null) 
     { 
      TestEvent(new EventArgs()); 
     } 
    } 
    private void TestEventHandler(EventArgs e) 
    { 
     System.Diagnostics.Trace.WriteLine("hi"); 
    } 

क्या तुमने कभी यह करना चाहिए? किसी भी कारण से मैं सोच सकता हूं कि क्या। आप अपने खुद के ही क्लिक बनाना चाहते हैं तो आप सिर्फ अपने दम पर MouseEventArgs का दृष्टांत कर सकते हैं, भी:

MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1); 
+4

आप EventArgs.Empty http://msdn.microsoft.com/en-us/library/system.eventargs.empty.aspx – Gavin

+0

भी एक टाइपो का उपयोग कर सकते हैं? 'TestEventEventHandler'। दो घटना शब्द हैं। लेकिन कोड में। आपने 'टेस्टइवेंट हैंडलर' का इस्तेमाल किया था। – Bigeyes

5

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

13

आप सामान्य प्रकार दृष्टिकोण के माध्यम से EventArgs वर्ग का उपयोग कर सकते हैं। घटना सुनकर

if(SizeRectChanged != null){ 
    Rect r = new Rect(0,0,0,0); 
    SizeRectChanged(this,r); 
} 

:

public EventHandler<Rect> SizeRectChanged; 

घटना स्थापना:

anyElement.SizeRectChanged += OnSizeRectChanged; 

public void OnSizeRectChanged(object sender, Rect e){ 
    //TODO abything using the Rect class 
    e.Left = e.Top = e.Width = e.Height = 50; 
} 

तो, की जरूरत नहीं है इस नमूने में, मैं रेक्ट वर्ग के साथ वापसी प्रकार के रूप में उपयोग करेगा नए कार्यक्रम कक्षाओं या प्रतिनिधियों को बनाने के लिए, बस एक विशिष्ट प्रकार टी

+1

यह गलत लगता है। [एमएसडीएन वेबसाइट उदाहरण] (http://msdn.microsoft.com/en-us/library/db0etb8x%28v=vs.110%29.aspx) दिखाता है कि Rect या TEventArg को EventArgs से उत्तराधिकारी होना है। जब तक कुछ ऐसा नहीं होता है तो मैं गलतफहमी कर रहा हूं। –

+1

थॉमस, मुझे यह भ्रमित भी मिला। लेकिन जुपी के सुझाव ने मेरे लिए काम किया। –

+0

वाह ... इच्छा है कि मैं इसे बहुत समय पहले जानता था। मैंने हमेशा यह माना कि जब आपने EventHandler घोषित किया था, तो टी को EventArgs से प्राप्त होना चाहिए। तो उदाहरण के लिए यदि मुझे अपने कार्यक्रम के साथ एक स्ट्रिंग भेजने की ज़रूरत है, तो मैं एक नया वर्ग स्ट्रिंगवेन्टआआरजी बनाउंगा जो EventArgs से उप-वर्गीकृत है। थॉमस लैन द्वारा लिंक किया गया एमएसडीएन दस्तावेज़ निश्चित रूप से कहता है "इसका दूसरा पैरामीटर इवेंट आर्ट्स से लिया गया है और इवेंट डेटा रखता है" जो कि अधिकांश पाठकों को इंगित करेगा कि आप किसी भी मनमानी वर्ग का उपयोग नहीं कर सकते हैं। लेकिन संकलक को इवेंट हैंडलर पर ध्यान नहीं दिया जाता है और यह पूरी तरह से ठीक काम करता है जहां तक ​​मैं कह सकता हूं। – uglycoyote

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