Publikoval Michal Kočí dňa 25.4.2007 o 22:47 v kategórii Ostatné
Včera som sa presvdčil, že ak Vám nejaký nástroj vygeneruje kostru metódy, v mojom prípade obsluhu udalosti, že stojí za to si prečítať komentár, ktorý do nej nástroj zapíše. Môžete si tak ušetríť niekoľko hodín bádania.
Celé moje trápenie začalo, keď som chcel v jednom InfoPath formulári jeho odoslanie (Submit) vyriešiť vlastným kódom namiesto vstavanej submit funkcionality. Kód bol jednoduchý, zavolal naplnil jeden element hlavného dátového zdroja a následne len spustil jedno dátové spojenie (volanie webovej metódy). Samozrejme, celý kód som obalil do try/catch bloku a v prípade problému sa mal formulár prepnúť do iného pohľadu (View) a v ňom zobraziť chybu.
Keď som začal testovať odoslanie formulára, InfoPath vždy zobrazoval správu, že sa odoslanie nepodarilo. Tak som začal formulár debugovať a zistil som, že k žiadnej chybe v kóde nedochádza. Celé sa mi to nejak nezdalo. Tak som odstránil celý kód metódy, ostala nič nerobiaca metóda. Stále chyba pri odosielaní. To už som bol trochu nahnevaný. Tak som prestavil odosielanie späť na to vstavané v InfoPath a volal som tú istú webovú metódu. Bez problémov. V tomto momente som začal mať podozrenie, že alebo niečo podstatné prehliadam, alebo zavolanie webovej služby v submit udalosti nie je možné. Druhá možnosť sa mi nepozdávala.
Takže som sa chytil dokumentácie a začal študovať (FormEvents.Submit Event (Microsoft.Office.InfoPath)). Popis bol jasný. Treba si nechať vygenerovať kostru (prípadne postup ako to isté spraviť ručne) a do nej zapísať kód. Ak by z nejakého dôvodu bolo treba zrušiť submit, udalostná metóda obsahuje argumenty cez ktoré sa to dá spraviť. No a presne tam bol pes zakopaný. Hodnota argumentu, ktorá InfoPathu signalizuje, že sa má submit stornovať je default nastavená na true. Toto chovanie mi príjde trochu zvláštne (presne naopak sa správajú udalosti v ADO.Net). Keď som však v kóde zrušenie nastavil na false, všetko začalo fungovať ako hodinky.
Trochu som si ponadával na MS vývojárov. Dnes som si trochu ponadával na seba. Ale len trochu, nakoľko som si neni istý, že som si včera nechal kostru vygenervať, mám trochu matný pocit, že som si kód písal ručne. Ak som si však kostru nechal vygenerovať, tak som úplne nepozorný, lebo do vygenerovanej kostry InfoPath zapíše nasledovný komentár:
// If the submit operation is successful, set // e.CancelableArgs.Cancel = false; // Write your code here.
No nič, cca dve hodiny zabité, nervy v kýbli, šedivé vlasy. Záver? Možno som komentár prehliadol, ale tak či tak by dokumentácia mohla byť lepšia. Ak sa táto podstatná informácia mlže generovať do komentára, mala by byť podľa mňa aj v dokumentácii.
Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.