Prepnutie View v udalosti Loading InfoPath formulára

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:

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

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.