Publikoval Michal Kočí dňa 21.4.2007 o 02:38 v kategórii InfoPath
InfoPath 2007 formulár môže obsahovať niekoľko pohľadov (View) na dáta. Môžete tak mať rôzne pohľady pre rôznych užívateľov. Alebo rôzne pohľady pre rôzne fázy práce s formulárom (jeden pohľad pre vypĺnanie dát, iný pre zobrazenie, iný pre dopĺňanie informácií, ...). Alebo môžete pohľad využiť na zobrazenie chybovej hlášky užívateľovi. V každom prípade, prepnutie pohľadu v udalosti Loading vyžaduje malý workaround.
Celý problém spočíva v tom, že kolekcia pohľadov (ViewInfos), ktorá má metódu na prepnutie pohľadu (SwitchView) nie je v momente nahrávania formulára použiteľná, pretože pohľad ešte nie je inicializovaný. Preto nasledovné volanie vyvolá výnimku:
public void InternalStartup() { EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading); } public void FormEvents_Loading(object sender, LoadingEventArgs e) { ViewInfos.SwitchView("View 2"); }
Kód pre pridanie ošetrenia udalosti Loading pridáte cez menu Tools, Programming, Loading Event:
Vyvolaná výnimka má jasný popis: Invalid Context: SwitchView cannot be called in the Loading event. Tento Vám však neporadí ako toto obmedzenie obísť. Keď trochu zagooglíte, nájdete síce nejaké odporúčania, ktoré hovoria o tom, že máte použiť vlastnosť IsDefault pohľadu, lenže táto vlastnosť v InfoPath 2007 nie je.
Tento workaround platí len pre webové formuláre, pre newebové formuláre mi z nejakého dôvodu nefungoval. Workaround na obídenie tohto problému je nasledovný: Keďže v momente nahrávania formulára už môžete pracovať s dátovým zdrojom (Data Source), pridajte si do neho element, ktorého hodnota Vám bude signalizovať že máte zobraziť iný pohľad. Napríklad element SwitchToView2. Potom jeho hodnotu nastavte v udalosti Loading ak si prajete zobraziť iný pohľad:
public void FormEvents_Loading(object sender, LoadingEventArgs e) { bool switchToView2 = false; // kontrola ci treba prepnut na view 2 if (switchToView2) { XPathNavigator doc = MainDataSource.CreateNavigator(); XPathNavigator flag = doc.SelectSingleNode("/my:myFields/my:SwitchToView2", NamespaceManager); flag.SetValue("TRUE"); } }
Následne v menu Tools vyberte Form Options a nastavte sa na záložku Open and Save:
Kliknite na tlačidlo Rules kde pridáte nové pravidlo:
V nasledujúcom dialógu kliknite na Add Action, zobrazí sa Vám dialóg, v ktorom pridáme novú akciu - prepnutie pohľadu na pohľad View 2:
Keď kliknete na OK a vrátite sa do dialógu pravidla (Rule), kliknite na Set Condition. Nastavíme podmienku pre pravidlo - chceme aby sa pravidlo vykonalo iba ak sa hodnota elementu SwitchToView2 rovná TRUE:
Keď kliknete na OK vrátite sa do dialógu pravidla ktoré si pomenujte:
Keď stlačíte OK tak sa pravidlo pridá do zoznamu pravidiel:
Po spustení formulára sa spustí udalosť Loading, v nej na základe potreby sa nastaví hodnota elementu SwitchToView2 na TRUE a ak áno, potom sa Vám ako prvý pohľad zobrazí View 2. Kód v udalosti Loading sa vykoná korektne aj v newebovom formuláry, napriek tomu mi nechcelo fungova pridané pravidlo.
Navyše, pri webových formulároch máte možnosť zakázať užívateľom prepínanie sa medzi pohľadmi. Stačí odškrtnúť voľbu Views za záložke Browser v možnostiach formulára:
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.