IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:9.5.2014 15:28

Ahoj, řeším celkem hloupý problém: mám UserControlk kde chci mít vlastní událost. Vždy, když se pokusím tu událost spustit

Event(this,EventArgs.Empty);

, spadne to s chybou

Odkaz na objekt není nastaven na instanci objektu.
Odpovědět
9.5.2014 15:28
the cake is a lie
Avatar
Odpovídá na Petr Čech
Michal Žůrek - misaz:9.5.2014 15:40

dej si tam breakpoint a podívej se co není instance objektu. Navíc si nejsem jistý jestli se události volají tak jako metody. Ve Visual Basicu je k tomu klíčové slovo RaiseEvent, v C# nevím.

 
Nahoru Odpovědět
9.5.2014 15:40
Avatar
coells
Tvůrce
Avatar
Odpovídá na Petr Čech
coells:9.5.2014 18:42

Korektní kód pro události vypadá takhle:

private event EventHandler _handler;

public event EventHandler Handler
{
        add { _handler += value; }
        remove { _handler -= value; }
}


public void RaiseMyHandler()
{
        if (_handler)
                _handler(this, EventArgs.Empty);
}
 
Nahoru Odpovědět
9.5.2014 18:42
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na coells
Petr Čech:9.5.2014 20:14

Nefunguje :(
A nevím, co myslíš tím

if(_handler)

EventHandler přeci není bool

Editováno 9.5.2014 20:15
Nahoru Odpovědět
9.5.2014 20:14
the cake is a lie
Avatar
coells
Tvůrce
Avatar
Odpovídá na Petr Čech
coells:9.5.2014 20:15

:-D No tak to je blbý

 
Nahoru Odpovědět
9.5.2014 20:15
Avatar
coells
Tvůrce
Avatar
Odpovídá na Petr Čech
coells:9.5.2014 20:15

sorry, má to být if (_handler != null) ... zvyk z C

 
Nahoru Odpovědět
9.5.2014 20:15
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na coells
Petr Čech:9.5.2014 20:19

Vypadá to jako že objekt, uvnitř kterého se pracuje je null, ale to je blbost, ne? Ačkoliv tam nikde konstruktor nevidím.

Editováno 9.5.2014 20:19
Nahoru Odpovědět
9.5.2014 20:19
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na coells
Petr Čech:9.5.2014 21:51

Hmmm, ten Event je null. Celé je to nějak divné. o_O

Nahoru Odpovědět
9.5.2014 21:51
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:9.5.2014 21:59

Není, událost je taky objekt. Registruj si tam nějakou metodu a nebo dej prázdného delegáta.

 
Nahoru Odpovědět
9.5.2014 21:59
Avatar
coells
Tvůrce
Avatar
Odpovídá na Petr Čech
coells:9.5.2014 22:00

Prostě si tu událost nezaregistruješ.
event je vždy null, pokud nebyla zaregistrována alespoň jedna metoda, proto je nutné používat ten kód, který jsem uvedl výše.

 
Nahoru Odpovědět
9.5.2014 22:00
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na coells
Jan Vargovský:9.5.2014 22:45

Je nějak razantně špatně, když event občas initializuju jako event ... = delegate {} ? :)

 
Nahoru Odpovědět
9.5.2014 22:45
Avatar
coells
Tvůrce
Avatar
Odpovídá na Jan Vargovský
coells:9.5.2014 23:01

Špatně to není, ale vzhledem k tomu, že je lepší dávat inicializaci instančních proměnných do konstruktoru, tak bych preferoval event += ...
Vyhneš se tak do budoucna promáznutí už zaregistrovaných handlerů. Kontrola na null před vyvoláním události je navíc jistější ve chvíli, kdy používáš recyklaci instancí.

 
Nahoru Odpovědět
9.5.2014 23:01
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na coells
Petr Čech:10.5.2014 10:59

ÁÁÁ, už mi to došlo, musel jsem si na to udělat extra projekt.

Nahoru Odpovědět
10.5.2014 10:59
the cake is a lie
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.