Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
Avatar
Petr Čech (czubehead):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
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
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
Nesnáším {}, proto se jim vyhýbám.
Avatar
coells
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
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
Odpovídá na coells
Petr Čech (czubehead):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
Why so serious? -Joker
Avatar
coells
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
coells:9.5.2014 20:15

:-D No tak to je blbý

 
Nahoru Odpovědět 9.5.2014 20:15
Avatar
coells
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
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
Odpovídá na coells
Petr Čech (czubehead):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
Why so serious? -Joker
Avatar
Odpovídá na coells
Petr Čech (czubehead):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
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
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
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
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ý
Redaktor
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
Redaktor
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
Odpovídá na coells
Petr Čech (czubehead):10.5.2014 10:59

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

Nahoru Odpovědět  +1 10.5.2014 10:59
Why so serious? -Joker
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.