O možnostech převodu telefonního čísla na písmenný tvar jsme už jednou psali. V následujícím článku si ukážeme, jak téhož docílit v ASP.NET. Začátečníci si kromě toho mohou zopakovat práci s webovým formulářem, validátory a codebehind.

Vyjdeme ze staršího článku, kde se písmenné varianty telefonního čísla MSISDN (Mobile Station International ISDN Number – mezinárodní číslo stanice GSM v ISDN) generovaly v prohlížeči klienta pomocí JavaScriptu. Základem je převodní tabulka (pole), které obsahuje písmenné shluky pro odpovídající hodnoty kláves. Ve stránce dáme k dispozici formuláře s TextBoxem pro zadávání čísla k převodu a odesílací Button. Na pole TextBoxu navážeme validátory požadovaného vstupu (RequiredFieldValidator) a požadovaného formátu telefonního čísla (RegularExpressionValidator) – 1 až 6 numerických znaků. Hlášení validátorů jsou zahrnuta do prvku ValidationSummary, aby byla úhledně srovnána pod textovým polem.

Výsledek, tedy opis zadaného čísla, počet písmenných kombinací a vlastní varianty slov, jsou zobrazovány pod formulářem pomocí prvků Label. Jak vidíte z ukázky (podklady/1999-2008), výstup písmenných kombinací slov je uzavřen do DIVu s definovanou šířkou, výškou a vlastností overflow: auto, díky čemuž se uživateli do stránky nevysype dlouhý seznam, ale může si pohodlně rolovat seznamem v přehledném boxu.

<%@ Page Language=“C#“ EnableViewState=“False“ EnableSessionState=“False“ Trace=“False“ Debug=“False“ Inherits=“MyPage“ CodeBehind=“MSISDN2Word.cs“ Src=“MSISDN2Word.cs“ %><?xml version=“1.0″ encoding=“utf-8″ ?>
<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Transitional//EN“ „http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=“http://www.w3.org/1999/xhtml“ xml:lang=“cs-CZ“ lang=“cs-CZ“ dir=“ltr“>
<head>
<meta http-equiv=“Content-type“ content=“text/html; charset=utf-8″ />
<meta http-equiv=“Content-script-type“ content=“text/javascript“ />
<meta http-equiv=“Imagetoolbar“ content=“no“ />
<meta http-equiv=“MSThemeCompatible“ content=“no“ />
<meta name=“Language“ content=“cs-CZ“ />
<meta name=“MSSmartTagsPreventParsing“ content=“true“ />
<title>Převod čísla na slovo</title>
</head>
<body>
<h1>Převod telefonního čísla MSISDN na slovo</h1>
<form Id=“frmNum2Word“ Paginate=“true“ Title=“Převod MSISDN na slovo“ RunAt=“server“>
<asp:TextBox Id=“txtNum“ Numeric=“true“ Size=“6″ MaxLength=“6″ RunAt=“server“ />
<asp:Button OnClick=“Translate“ Text=“Přelož“ RunAt=“server“ />
<asp:RequiredFieldValidator Id=“Validator1″ Display=“None“ ControlToValidate=“txtNum“ ErrorMessage=“Nezadali jste telefonní číslo“ RunAt=“server“ />
<asp:RegularExpressionValidator Id=“Validator2″ Display=“None“ ValidationExpression="^[0-9]{1,6}$" ControlToValidate=“txtNum“ ErrorMessage=“Telefonní číslo je neplatné“ RunAt=“server“ />
<asp:ValidationSummary FormToValidate=“frmNum2Word“ RunAt=“server“ />
</form>
<asp:Label Id=“lblNum“ Visible=“false“ RunAt=“server“ />
<asp:Label Id=“lblCountWords“ Visible=“false“ RunAt=“server“ />
<br /><br />
<div style=“width:180px;height:220px;overflow:auto;“>
<asp:Label Id=“ltrNumWords“ Visible=“false“ RunAt=“server“ />
</div>
</body>
</html>

Výše uvedený kód stránky je obsluhován kódem včleněným do souboru MSISDN2Word.cs, ve kterém je definována naše třída MyPage, ze které naše stránka dědí – jde o takzvaný CodeBehind, jak je vidět z direktivy stránky v prvním řádku.

using System;
using System.Text;
using System.Web;
public class MyPage : System.Web.UI.Page
{
  private String [] dd = {„0“, „1“, „ABC“, „DEF“, „GHI“, „JKL“, „MNO“, „PQRS“, „TUV“, „WXYZ“};
  private int CountWords = 0;
  private StringBuilder StoreWords = new StringBuilder(String.Empty);
  protected System.Web.UI.WebControls.Label lblNum;
  protected System.Web.UI.WebControls.Label ltrNumWords;
  protected System.Web.UI.WebControls.Label lblCountWords;
  protected System.Web.UI.WebControls.TextBox txtNum;
  void GenWords (String instr,String toStr)
  {
    if( instr.Length > 0 )
    {
      int a = Convert.ToInt16(instr.Substring(0,1));
      for(int i=0; i<dd[a].Length; i++ )
      {
        GenWords( instr.Substring(1), toStr + dd[a].Substring(i,1));
      }
    }
    else
    {
      StoreWords.Append(toStr + „<br />“);
      CountWords++;
    }
    ltrNumWords.Text = StoreWords.ToString();
    lblCountWords.Text = „Možností: “ + CountWords;
  }
  public void Translate (Object sender, System.EventArgs e)
  {
    if (!Page.IsValid)
    {
      lblNum.Visible = false;
      ltrNumWords.Visible = false;
      lblCountWords.Visible = false;
    }
    else
    {
      lblNum.Text = „Číslo: “ + txtNum.Text;
      lblNum.Visible = true;
      GenWords(txtNum.Text,String.Empty);
      ltrNumWords.Visible = true;
      lblCountWords.Visible = true;
    }
  }
}

Algoritmus je převzat z článku generujícího písmenné kombinace u klienta. V třídě MyPage máme definováno pole shluků kombinací písmen na klávesách, proměnnou pro počet kombinací, proměnnou určenou pro vypočtené písmenné kombinace a prvky webového formuláře, s kterými chceme programově manipulovat (Textbox a Labely). Obsluha události při odeslání formuláře Translate() ověří, zda neprotestují validátory – pokud ano, zneviditelní zobrazovací Labely a výpočet se nebude provádět. Pokud je stránka validní, nastaví se vlastnosti Text použitých Labelů na opis zadaného číslo, počet zjištěných kombinací a řetězec zjištěných možných kombinací znaků. Tyto kombinace vypočítává rekurzivní funkce GenWords, která prochází zadaný řetězec a přiřazuje postupně jednotlivé znaky ze shluků v poli dd[].

Všimněte si, že pokud používáte browser podporující DHTML, validace proběhne u klienta. Pokud není zadaný údaj validní, stránka se neodešle na server, nedojde k provedení obsluhy události funkcí Translate() a nedojde tedy k zneviditelnění Labelů s výstupními údaji. V naší aplikaci, kde zneviditelnění prvků při nevalidním vstupu provádíme jen pro urychlení renderování stránky, to nijak nevadí, v jiných aplikacích to může být na závadu, na což bychom měli brát zřetel.

Za zmínku zde stojí použití typu StringBuilder a jeho metody Append pro „naskládání“ výsledných kombinací i s elementem pro přechod na nový řádek (<br />) do řetězce – tato je totiž přesně pro takovéto použití určena, a je tak mnohem rychlejší a operativnější než možná někoho svádějící String, do kterého bychom přidávali další obsah operátorem +. Od předchozího článku se také liší parametry metody substring() – laicky řečeno, v JavaScriptu odkud-pokud, v C# odkud-kolik, což jsou drobnosti, které nás mohou zaskočit při úpravě algoritmu z jiného jazyka.

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

Odpovědět