2010-08-13 6 views
8

मैं इस प्रकार की एक घटना को संभालने के लिए कुछ कोड लिखा है:मुझे कैसे पता कर सकते हैं अगर एक .net घटना पहले से ही नियंत्रित किया जाता है?

AddHandler myObject.myEvent, AddressOf myFunction 

ऐसा लग रहा था कि सब कुछ पहली बार में काम कर रहा था, लेकिन जब मैं डिबगर भाग गया, मुझे लगता है कि अक्सर, myFunction कई बार हर बार चल पाएंगे की खोज की myObject.myEvent निकाल दिया गया। मैं पता लगा है कि मैं कोड, एक बार से अधिक चलाने के लिए इस व्यवहार में परिणित ईवेंट हैंडलर जोड़ने की अनुमति दी थी।

वहाँ एक रास्ता मैं कुछ इस तरह कर सकते हैं?

If myObject.myEvent is not handled Then 
    AddHandler myObject.myEvent, AddressOf myFunction 
End If 

उत्तर

11

मान लीजिए कि यह आपका कोड नहीं है जो ईवेंट प्रकाशित कर रहा है, आप नहीं कर सकते। विचार यह है कि ग्राहकों को एक दूसरे से अलग किया जाता है - आप अन्य घटना ग्राहकों के बारे में नहीं पता कर सकते हैं, इवेंट स्वयं को बढ़ा सकते हैं।

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

+1

"डॉक्टर, यह दर्द होता है जब मैं यह करता हूँ।" "तो ऐसा मत करो।" –

+0

आप इस बारे में सही हैं कि यह एक हैक की तरह है, विशेष रूप से आपके ईवेंट को दबाए जाने से प्रभावी रूप से मेमोरी रिसाव हो सकता है। –

5

कोई एक:

  1. अपने हैंडलर एक बार से अधिक न जोड़ें। बस यह जोड़ने से पहले हैंडलर को दूर करने के

  2. प्रयास।

+0

यदि आप हैंडलर को हटाने का प्रयास करते हैं और यह अस्तित्व में नहीं है तो यह एक nullreferenceexception – Sebastien

+3

फेंक देगा हालांकि मैं यह एक शून्य संदर्भ भी फेंकता हूं, लेकिन ऐसा नहीं है। यदि ऑब्जेक्ट मौजूद नहीं है तो शून्य त्रुटि फेंक दी जाती है। MyObject.myEvent पर हैंडलर निकालें, अगर मेरा ऑब्जेक्ट मौजूद नहीं है तो त्रुटि फेंक देगा। – user1500403

0

अपने ईवेंट हैंडलर परिणाम डेटाबेस/सत्र में सहेजें और फिर यह जांचने के लिए फिर से पढ़ें कि ईवेंट पहले से ही संभाला गया है या नहीं।

2

यह बताने का कोई तरीका नहीं है कि एक हैंडलर पहले ही संलग्न है लेकिन आप एडहैंडलर को कॉल करने से पहले ईवेंट पर RemoveHandler को सुरक्षित रूप से कॉल कर सकते हैं। यदि पहले से ही हैंडलर नहीं है, तो RemoveHandler का कोई प्रभाव नहीं पड़ेगा।

+1

सत्य नहीं होगा एक nullreference अपवाद – Sebastien

+0

घटना सदस्य केवल शून्य होगा अगर कोई हैंडलर संलग्न नहीं हैं। लेकिन यह बताने का कोई अच्छा तरीका नहीं है कि एक विशिष्ट हैंडलर पहले से ही जुड़ा हुआ है या नहीं। – Josh

-3

आप अपने ईवेंट की जांच करने के लिए IsHandleCreated संपत्ति का उपयोग कर सकते हैं या नहीं।

If e.Control.IsHandleCreated = False Then 
      AddHandler e.Control.KeyPress, AddressOf TextBox_keyPress 
    End If 
+0

IsHandle एक विंडो हैंडल के लिए चेक किए गए चेक, ईवेंट सब्सक्राइबर ढूंढने के साथ इसका कोई लेना-देना नहीं है –

2

मैं जानता हूँ कि यह एक पुरानी पोस्ट है लेकिन सिर्फ जो लोग इस दिशा में देख आ के लिए एक समाधान जोड़ना चाहते थे ...

VB.Net <YourEvent>Event के पैटर्न में एक विशेष निजी सदस्य चर बनाता है कि आप कुछ भी के खिलाफ परीक्षण करने के लिए उपयोग कर सकते हैं।

Public Event MyClick As EventHandler 

Private Sub OnMyClick() 
    If MyClickEvent IsNot Nothing Then 
     RaiseEvent MyClick(Me, New EventArgs()) 
    Else 
     ' No event handler has been set. 
     MsgBox("There is no event handler. That makes me sad.") 
    End If 
End Sub 

उत्तर यहाँ से प्राप्त: Determine if an event has been attached to yet

-1

हैंडलर निकालें और फिर इसे जोड़ें। इस तरह यह कभी नकल नहीं किया जाएगा। यदि आपकी ऑब्जेक्ट मौजूद नहीं है तो शून्य संदर्भ त्रुटि से सावधान रहें। मैं उस पर भी पकड़ा गया और ऐसा तब हो सकता है जब आप हैंडलर के उपरोक्त हैंडलर को हटा रहे हों।

if not myObject in nothing then AddHandler myObject.myEvent, AddressOf myFunction 
if not myObject in nothing then AddHandler myObject.myEvent, AddressOf myFunction 
0

मुझे पता है कि मैं खेल के लिए कुछ साल देर से हूं लेकिन आप हमेशा कक्षा चर का दायरा बना सकते हैं और फिर इसे तथ्य के बाद सेट कर सकते हैं। यह चीजों को करने का एक पूरी तरह से कठोर तरीका नहीं है, लेकिन यह उम्मीद करने से बेहतर है कि आपके पास कुछ भी नहीं था या इसे हर बार जोड़ना नहीं था। मेरे मामले में मैंने इसे WinForms ऐप में इस्तेमाल किया था, मैं डेटाग्रिडव्यू सतह पर खींचने और छोड़ने के लिए एक हैंडलर जोड़ना चाहता था। मैं इस कार्यक्षमता को रोकना चाहता था अगर किसी अन्य डेटाग्रिडव्यू का हिस्सा अभी तक पूरी तरह से भरा नहीं गया था कि यह निर्भर था।

तो यह इस तरह होगा:

कक्षा स्तर

Private _handlersAdded As Boolean = False 

कंस्ट्रक्टर:

Public Sub New() 
    AddHandler dgv.DragEnter, AddressOf DragEnter 
    _handlersAdded = True 
End Sub 

विधि निर्धारित करता है कि मुद्दा:

Private Sub CheckRowsAreDone() 
    For Each row As DataGridViewRow In dgv.Rows 
    Dim num = 0 

    For i = 0 To row.Cells.Count - 1 
     Dim val = If(Not String.IsNullOrEmpty(row?.Cells(i)?.Value?.ToString), 1, -1) 
     num += val 
    Next 

    If num > -(row.Cells.Count) And num < (row.Cells.Count) Then 
     RemoveHandler dgv.DragEnter, AddressOf DragEnter 
     _handlersAdded = False 
     Exit Sub 
    End If 

    If Not _handlersAdded Then 
     AddHandler dgv.DragEnter, AddressOf DragEnter 
     _handlersAdded = True 
    End If 

    Next 
End Sub 
संबंधित मुद्दे