O převodu čísla na písmenné vyjádření jsme již psali několikrát – tentokrát si ale si ukážeme, jak téhož docílit na displeji libovolného mobilního zařízení. Naučíme se stránkovat obsáhlá data, která by se najednou do paměti přístroje nevešla, ukážeme validaci a použití codebehind v takzvané mobilní aplikaci.

Pro teorii převodu čísla na slovo odkazuji na předchozí článek. Naši mobilní aplikaci jsem rozčlenil na designovou část, ve které se nachází mobilní formulář a část s výkonným skriptem, tzv. CodeBehind. Prohlédněte si ukázku (do prohlížeče v mobilním telefonu je třeba zadat celou adresu ukázky), její zdrojový kód si můžete stáhnout.

<%@ Page Language=“C#“ Debug=“False“ Inherits=“MyMobile“ CodeBehind=“MSISDN2WordMobile.cs“ Src=“MSISDN2WordMobile.cs“ %>
<%@ Register TagPrefix=“Mobile“ Namespace=“System.Web.UI.MobileControls“ Assembly=“System.Web.Mobile“ %>
<Mobile:Form Id=“frmNum2Word“ Paginate=“true“ OnPaginated=“Form_Paginated“ OnActivate=“Form_Activate“ Title=“MSISDN na slovo“ RunAt=“server“>
  <Mobile:TextBox Id=“txtNum“ Numeric=“true“ Size=“6″ MaxLength=“6″ RunAt=“server“ />
  <Mobile:RequiredFieldValidator Id=“Validator1″ Display=“Dynamic“ ControlToValidate=“txtNum“ ErrorMessage=“Nezadali jste telefonní číslo“ RunAt=“server“ />
  <Mobile:RegularExpressionValidator Id=“Validator2″ Display=“Dynamic“ ControlToValidate=“txtNum“ ValidationExpression=“^\d+$“ ErrorMessage=“Telefonní číslo je neplatné“ RunAt=“server“ />
  <Mobile:SelectionList Id=“SelectionList1″ RunAt=“server“>
    <Item Value=“1″ Text=“Běžně“ Selected=“True“ />
    <Item Value=“2″ Text=“Nezalamovat“ />
  </Mobile:SelectionList>
  <Mobile:Command OnClick=“Translate“ Text=“Přelož“ RunAt=“server“ />
  <Mobile:Label Id=“lblNum“ Visible=“false“ RunAt=“server“ />
  <Mobile:Label Id=“lblCountWords“ Visible=“false“ RunAt=“server“ />
  <Mobile:TextView Id=“txvNumWords“ Visible=“false“ RunAt=“server“ />
</Mobile:Form>

Ve stránce vidíme formulář, který má nastaveny obsluhy událostí a zejména zapnuto stránkování – vlastnost Paginate. Stránkování je u mobilních zařízení důležité, mezi zařízeními jsou totiž velké rozdíly v množství dat, které jsou schopny najednou pojmout ve stránce k zobrazení. Rozdělit výsledky bychom mohli samozřejmě sami, ovšem mechanismus stránkování v ASP.NET mobilních aplikacích je bezproblémový a velmi snadno použitelný. Ve skutečnosti využívá session a view_state pro ukládání „porcí“ jednotlivých stránek, z hlediska vývoje aplikace se o to ale nemusíme vůbec starat. Ať vygenerujeme jakýkoli obsah formuláře, systém ASP.NET sám připraví jednotlivé stránky o velikosti přesně vhodné pro dané zařízení a vloží potřebné odkazy pro přechod na následující nebo předcházející stránku. Zde bych jen podotknul, že už z principu stránkování mobilních formulářů je třeba, aby v aplikaci nebyl vypnutý view_state a mechanismus session, jinak stránkování nebude pracovat správně.

Dále je ve formuláři textbox pro zadávání čísla, které chceme převést, s přednastavením typu zadávaných numerických údajů (má smysl u mobilních zařízení, které tak přepne klávesnici pro zadávání čísel). Správnost zadávaného čísla nám ověřují validátory, podobně jako v jakékoli jiné ASP.NET aplikaci (pro povinné zadání a pro zadávání pouze čísel). Pro jednoduchost jsem ani nepoužil prvek shrnující výsledek validace, pouze jsem každému validátoru nastavil vlastnost Display na Dynamic, aby ve výsledném designu stránky nezabíraly nadbytečné místo.

Pro ukázku práce s formulářovými prvky jsem aplikaci rozšířil o nabídku volitelných možností, na které je dobře vidět, jak můžeme uživateli dát v mobilní aplikaci na výběr. Použitý prvek SelectionList má mnoho možností nastavení vzhledu, já jsem se rozhodl těchto nastavení nevyužít a ponechat tak plně na systému ASP.NET, jaký vzhled pro dané zařízení zvolí (v běžném prohlížeči obvykle selectbox, na mobilním telefonu nejčastěji radibuttony). V aplikaci si tak uživatel může zvolit, zda se výsledek převodu má zalamovat či nikoli – na některých mobilních zařízeních je displej přehlednější, pokud se řádek nezalomí, ale sám automaticky roluje vodorovně (podporují např. telefony Siemens, ale i další).

Odeslání formuláře zajišťuje Command, na který je navázána obsluha události OnClick. Tento se ve stránce obvykle objeví jako odesílací tlačítko, na některých telefonech však i jen jako položka v menu. Potvrzením se provede funkce Translate, která zajistí převod a naplnění Labelů a prvku pro zobrazení dlouhého textu TextView. Na všech použitých prvcích vidíme variabilitu, s jakou se .net Framework automaticky přizpůsobuje různým zařízením, které rozpozná (a pokud je nerozpozná, snadno lze jeho definici doplnit do konfigurační sekce browserCaps).

Následující kód rozšiřuje možnosti System.Web.Mobile, ze které dědí naše nová třída MyMobile, použitá pro aplikaci:

using System;
using System.Text;
using System.Web.Mobile;
public class MyMobile : System.Web.UI.MobileControls.MobilePage
{
  String [] keyCodes = new String [] {„0“, „1“, „ABC“, „DEF“, „GHI“, „JKL“, „MNO“, „PQRS“, „TUV“, „WXYZ“};
  int CountWords = 0;
  private StringBuilder StoreWords = new StringBuilder(String.Empty);
  protected System.Web.UI.MobileControls.Label lblNum;
  protected System.Web.UI.MobileControls.TextView txvNumWords;
  protected System.Web.UI.MobileControls.Label lblCountWords;
  protected System.Web.UI.MobileControls.TextBox txtNum;
  protected System.Web.UI.MobileControls.SelectionList SelectionList1;
  protected System.Web.UI.MobileControls.Form frmNum2Word;
  private void GenWords (String inStr,String toStr)
  {
    if( inStr.Length > 0 )
    {
      int a = Convert.ToInt16(inStr.Substring(0,1));
      for(int i=0; i<keyCodes[a].Length; i++ )
      {
        GenWords( inStr.Substring(1), toStr + keyCodes[a].Substring(i,1));
      }
    }
    else
    {
      StoreWords.Append(toStr);
      StoreWords.Append(„&nbsp; „);
      CountWords++;
    }
    txvNumWords.Text = StoreWords.ToString();
    lblCountWords.Text = „Možností: “ + CountWords.ToString();
  }
  public void Translate (Object sender, System.EventArgs e)
  {
    if (!Page.IsValid)
    {
      lblNum.Visible = false;
      txvNumWords.Visible = false;
      lblCountWords.Visible = false;
    }
    else
    {
      lblNum.Text = „Číslo: “ + txtNum.Text;
      lblNum.Visible = true;
      switch (SelectionList1.Selection.Value)
      {
        case „1“:
          txvNumWords.Wrapping=System.Web.UI.MobileControls.Wrapping.Wrap;
        break;
        case „2“:
          txvNumWords.Wrapping=System.Web.UI.MobileControls.Wrapping.NoWrap;
        break;
        default:
          txvNumWords.Wrapping=System.Web.UI.MobileControls.Wrapping.NotSet;
         break;
       }
       GenWords(txtNum.Text,String.Empty);
       txvNumWords.Visible = true;
       lblCountWords.Visible = true;
    }
  }
  public void Form_Paginated(object sender, EventArgs e)
  {
    frmNum2Word.PagerStyle.PreviousPageText = „<<„;
    frmNum2Word.PagerStyle.NextPageText = „>>“;
    if(ActiveForm.PageCount>1)
  }
  public void Form_Activate(object sender, EventArgs e)
  {
    frmNum2Word.ControlToPaginate = txvNumWords;
  }
}

Codebehind, stejně jako předchozí klasická aplikace, obsahuje deklaraci ovládacích prvků, pomocné proměnné a obslužné funkce pro výpočet písmenných kombinací kláves. Novinkou jsou zde obsluhy událostí formuláře. Form_Activate je vyvolána v okamžiku, kdy je formulář aktivní – tehdy řekneme metodou ControlToPaginate, že při stránkování nás zajímá hlavně obsah prvku txvNumWords (TextView, který je po výpočtu naplněn písmennými kombinacemi). Form_Paginated nastane, když je obsah formuláře tak objemný, že dojde k rozdělení na stránky – zde pomocí vlastností PreviousPageText a NextPageText třídy PagerStyle nastavíme text odkazů pro stránkování. Mohli bychom sice ponechat výchozí „Prev“ a „Next“, ale vzhledem k jednoduchosti si zde pro ukázku nastavíme mezinárodně vypadající „šipky“ (nebo třeba „Předchozí“ „Další“).

Aplikace je po uložení na server připravena k činnosti – vyzkoušejte, jak se chová na různých zařízeních. Patřilo by se ošetřit i výjimky, které mohou nastat v případě, že vyprší platnost session, to jsem však pro zachování přehlednosti vynechal.

Odkazy a zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět