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.