2009-06-18 11 views
5

Mam dwa obiekty - jeden zawierający kod z wywołaniem zdarzenia i taki, który zawiera procedurę obsługi tego zdarzenia. Nie mogę "AddHandler" w Load pierwszego obiektu, ponieważ instancja drugiego obiektu jeszcze nie istnieje. Kiedy podniosę swoje wydarzenie, chcę sprawdzić, czy kopia obiektu2 została utworzona (łatwe do zrobienia), i czy do zdarzenia dołączono obsługę (nie wiem jak to zrobić).Ustal, czy zdarzenie zostało dołączone do jeszcze jednego atrybutu:

Jestem także otwarty na inne zalecenie dotyczące tego, jak to zrobić. Jeśli zrobię mój AddHandler w Object1.Load, a Object2 jeszcze nie istnieje, to nigdy nie obsłuży mojego wydarzenia, nawet jeśli utworzę je później. W tej chwili, w kodzie, który uruchamia to wydarzenie, po prostu uciekam się do wykonywania RemoveHandler, a następnie AddHandler za każdym razem, gdy wydarzenie jest wywoływane, i wtedy wiem, że dołączę, gdy obiekt w końcu istnieje, ale wiem o tym to nieudolna metoda.

Widziałem artykuł o czymś podobnym (Determine list of event handlers bound to event) i być może brakuje mi czegoś w tłumaczeniu, ale nie mogę uzyskać kodu do pracy na moim niestandardowym wydarzeniu w VB.NET.

+1

Dlaczego nie można użyć withevents? – chrissie1

+0

Nie jestem pewien, w jaki sposób użycie WithEvents wpłynęłoby na moją sytuację - nie chodzi o to, czy zdarzenie nie zostało podniesione, czy o obsługę nie działa poprawnie - oboje są w porządku. Po prostu nie mogę dołączyć handler'a, dopóki nie otrzymam instancji obiektu, która obsłuży to wydarzenie, więc nie jestem pewien najlepszego miejsca, by to sprawdzić. – SqlRyan

Odpowiedz

1

Można też po prostu mieć pole bool sprawdzenie przed podpinania zdarzenie.

if not eventHooked then 
addhandler 
eventHooked = true 
end if 

Także, jeśli potrzebny jest dobry C# do vb konwerter http://www.tangiblesoftwaresolutions.com/ ma taki, który można przetłumaczyć do 100 linii w locie lub mniej lub przetłumaczyć projekt 1000 linii za darmo. Co więcej, musisz go kupić, ale zwykle te ograniczenia będą działały dobrze. Nie, nie próbuję ich reklamować :-)

+0

Zastanowiłem się nad tym, i prawdopodobnie to zrobię. Pomyślałem, że może być łatwy sposób na wykrycie, czy zdarzenie jest już zahaczone, ale jeśli nie jest, to jest to moja preferowana metoda. – SqlRyan

+0

Chociaż miałem nadzieję uniknąć tego rozwiązania, rozwiązuje to mój problem i działa jak mistrz. Dzięki za pomoc. – SqlRyan

0

Jeśli chcesz się dowiedzieć, czy dołączono jakąkolwiek funkcję obsługi, powinieneś być w stanie sprawdzić, czy zdarzenie ma wartość zerową.

if (MyButton.Click == null) 
{ 
    MyButton.Click += myEventHandler; 
} 

(dam ci tłumaczyć, że w VB)

+0

To nie zadziała, jeśli jakieś inne wydarzenie zostało już dodane. – ChrisF

+0

Robię to dla zdarzenia niestandardowego, a nie standardowego, a ten kod nie działa w tym przypadku - sprawdzanie wartości składni MyEvent kończy się niepowodzeniem, mówiąc mi "To jest wydarzenie i nie może być nazywany bezpośrednio ", więc nie mogę nawet skompilować. Przypuszczam, że to jest coś, co C# radzi sobie inaczej niż VB ... – SqlRyan

+0

@ChrisF: Właśnie dlatego zastanawiałem się, czy chce się dowiedzieć, czy * any * handler został dołączony (w porównaniu do konkretnego handler'a). Może wie, że tylko on go dotyka. @rwmnau: Jak rozumiem, Zdarzenia mogą być bezpośrednio dostępne tylko po zadeklarowanej klasie, więc ten kod musiałby zostać umieszczony w samej klasie. – StriplingWarrior

16

VB.Net tworzy specjalną prywatną zmienną składową według wzoru <YourEvent>Event, którą można następnie wykorzystać do przetestowania na Nic.

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 

http://blogs.msdn.com/b/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug-rothaus.aspx

1

Według tutaj odpowiedzi: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ec8ff1c-eb9b-4cb3-8960-9cd4b25434f2 (które wydają się działać według moich testów), czek na istniejących obsługi zdarzeń odbywa się na wywołanie RaiseEvent. Jeśli nie chcesz, aby podnieść zdarzenia i po prostu trzeba sprawdzić, czy są dołączone jakieś koparki, można sprawdzić wartość zmiennej ukrytej nazwie <your_event_name> zdarzeń jak:

Public Event Foo As ActionFoo 

If FooEvent IsNot Nothing Then... 
Powiązane problemy