2010-02-22 13 views
5

मैं एक कक्षा पुस्तकालय लिख रहा हूं जिसका उपयोग अन्य अनुप्रयोगों द्वारा किया जाएगा। मैं इसे सी # .NET में लिख रहा हूं। मुझे कक्षाओं में घटनाओं को ट्रिगर करने में समस्या है। यहाँ मैं क्या करने की जरूरत है ...आप कक्षाओं में एक कार्यक्रम कैसे ट्रिगर करते हैं?

public class ClassLibrary 
{ 
    public event EventHandler DeviceAttached; 

    public ClassLibrary() 
    { 
     // do some stuff 
     OtherClass.Start(); 
    } 
} 

public class OtherClass : Form 
{ 
    public Start() 
    { 
     // do things here to initialize receiving messages 
    } 

    protected override void WndProc (ref message m) 
    { 
     if (....) 
     { 
      // THIS IS WHERE I WANT TO TRIGGER THE DEVICE ATTACHED EVENT IN ClassLibrary 
      // I can't seem to access the eventhandler here to trigger it. 
      // How do I do it? 

     } 
     base.WndProc(ref m); 
    } 

} 
फिर आवेदन है कि मैं यह कर देगा वर्ग पुस्तकालय उपयोग कर रहा है में

...

public class ClientApplication 
{ 
    void main() 
    { 
     ClassLibrary myCL = new ClassLibrary(); 
     myCL.DeviceAttached += new EventHandler(myCl_deviceAttached); 
    } 

    void myCl_deviceAttached(object sender, EventArgs e) 
    { 
     //do stuff... 
    } 
} 

उत्तर

1

मुझे लगता है कि आपको घटनाओं के काम पर अपने परिप्रेक्ष्य को बदलना चाहिए। अन्य क्लास को ईवेंट का "स्वामित्व" होना चाहिए और इसे ट्रिगर करना चाहिए। क्लास लाइब्रेरी या क्लाइंट एप्लिकेशन (जो भी आप चुनते हैं) इस घटना को "सदस्यता लेने" के द्वारा "सुनता है" और यह घटना होने पर एक निश्चित कार्रवाई करता है।

यह कैसे लागू करने के लिए:

public class ClassLibrary 
{ 
    public OtherClass myOtherCl; 

    public ClassLibrary() 
    { 
     myOtherCl= new OtherClass(); 
     myOtherCl.Start(); 
    } 
} 

उत्प्रेरक वर्ग जहां यह तार्किक होता है जहां यह पता चला है में घटना।

public class OtherClass : Form 
{ 
    public event EventHandler DeviceAttached; 

    public Start() 
    { 
     // do things here to initialize receiving messages 
    } 

    protected override void WndProc (ref message m) 
    { 
     if (....) 
     { 
      OnDeviceAttach(); 
     } 
     base.WndProc(ref m); 
    } 

     public void OnDeviceAttach() 
     { 
      if (DeviceAttached != null) 
       DeviceAttached(); 
     } 

} 

अंत में, जो कोई भी करने के लिए घटना वर्ग घटना धारण के कहने पर पहुंच की आवश्यकता सुनने की जरूरत है, यही कारण है कि myOtherCl इस उदाहरण में सार्वजनिक किया गया है।

public class ClientApplication 
{ 
    void main() 
    { 
     ClassLibrary myCL = new ClassLibrary(); 
     myCL.myOtherCl.DeviceAttached += new EventHandler(myCl_deviceAttached); 
    } 

    void myCl_deviceAttached(object sender, EventArgs e) 
    { 
     //do stuff... 
    } 
} 
+0

एक तरफ के रूप में, सुनिश्चित करें कि आप थ्रेड सुरक्षा के लिए इसे फायर करने से पहले ईवेंट हैंडलर की प्रतिलिपि बना लें: 'var ev = DeviceAtached; अगर (ev! = null) ev(); ' – Tanzelax

8

आप ऐसा नहीं कर सकते। घटनाओं को केवल उस कक्षा के भीतर से उठाया जा सकता है जो घटना की घोषणा करता है।

आमतौर पर, आप घटना को बढ़ाने के लिए अपनी कक्षा पर एक विधि जोड़ने चाहते हैं, और फोन विधि:

public class ClassLibrary 
{ 
    public event EventHandler DeviceAttached; 
    public void NotifyDeviceAttached() 
    { 
     // Do processing and raise event 
    } 

बाद अपने अन्य कोड में, आप बस फोन था myCL.NotifyDeviceAttached();

+0

नोटिफ़ाइडेडवाइस को स्थिर होने की आवश्यकता है? अन्यथा अन्य क्लास से क्लास लाइब्रेरी के उदाहरण का संदर्भ कैसे दें जब अन्य क्लास ने इसे नहीं बनाया? – PICyourBrain

+0

आपको उचित फॉर्म के साथ अपना फॉर्म आपूर्ति करने की आवश्यकता होगी। अन्यथा, आप NotifyDeviceAttached स्थिर बना सकते हैं, लेकिन फिर आपको अपने ईवेंट हैंडलर को एक स्थिर ईवेंट भी बनाना होगा ... यह सब डिज़ाइन का मामला है। –

1

घटना हैंडलर को केवल उस वर्ग द्वारा ही बुलाया जा सकता है जिसने उन्हें घोषित किया है। आपको लगता है कि कक्षा के बाहर से ClassLibrary.DeviceAttached कॉल करने के लिए की जरूरत है, तो आप निम्नलिखित की तरह एक उपयोगिता विधि जोड़ने की जरूरत:

public void OnDeviceAttached() 
{ 
    DeviceAttached(); 
} 
+0

हम्म ठीक है। क्या घटना को कक्षा में संदर्भ के रूप में पारित किया जा सकता है और उस तरह कहा जाता है? – PICyourBrain

+0

@ जोर्डन एस: नहीं। सी # डिजाइनरों ने जानबूझकर इसे बनाया ताकि आप किसी अन्य वर्ग, यहां तक ​​कि उप-वर्ग से कोई ईवेंट नहीं बढ़ा सकें। आपको कक्षा से ऐसा करना होगा जिसने घटना घोषित की है। –

+0

क्या ऑनडिवाइस को स्थिर होने की आवश्यकता है? अन्यथा अन्य क्लास से क्लास लाइब्रेरी के उदाहरण का संदर्भ कैसे दें जब अन्य क्लास ने इसे नहीं बनाया? – PICyourBrain

1

आप सब यहाँ में एक समारोह का उपयोग नहीं कर सकते हैं। यह एक oversimplification है, लेकिन आम तौर पर एक घटना एक बच्चे घटक द्वारा उठाया जाता है जब इसे अपने माता-पिता को कुछ संवाद करने की आवश्यकता होती है। आपके मामले में (मैं आपके कोड से बात कर रहा हूं) आपका फॉर्म किसी विशिष्ट संदेश (जब कोई उपकरण संलग्न होता है) के लिए सुन रहा है, और जब यह उस संदेश को स्पॉट करता है तो उसे इसके बारे में myCL बताना होगा। इस उद्देश्य के लिए, आप इसके बजाय ClassLibrary में एक विधि बनाएं और इसे अपने फॉर्म से कॉल करें।

+0

मेरा उदाहरण बहुत सारे विवरण छोड़ देता है। अन्य क्लास वास्तव में एक दृश्यमान रूप नहीं है, यह केवल फॉर्म से विरासत में है ताकि यूएसबी डिवाइस संलग्न/प्राप्त होने पर इसका उपयोग विंडोज संदेशों को पकड़ने के लिए किया जा सके ... मुझे पता है कि यह भ्रमित है। – PICyourBrain

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

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