Diskuze: Události v UC

C# .NET .NET (C# a Visual Basic) Události v UC American English version English version

Avatar
Petr Čech (czubehead):

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):

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:

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):

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
Avatar
coells
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
coells:

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):

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):

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ý:

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:

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ý:

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:

Š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):

ÁÁÁ, 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.