ADO.NET a kontroly v ASP.NET

C# .NET ASP.NET Web Forms ADO.NET a kontroly v ASP.NET

Tento článek ukazuje jednoduché použití uživatelského kontrolu (User Control) a použití ADO.NET (struktura typu DataSet).

Prostředkem pro vícenásobné použití nějakého obecně napsaného kódu jsou v ASP.NET kontroly. Kontrolem tedy rozumějmě objekt nezávislý na všem ostatním, který je ovšem spojen vstupy (nastavení vlastností, volání nějakých metod atd) a poskytuje výstupy (vlastnosti, bublání událostí...). Druhy kontrolů v ASP.NET jsou dva, uživatelské a serverové. Uživatelské jsou jednodušší co do tvorby, mají příponu ascx.

Uděláme si jednoduchý kontrůlek, který bude vykreslovat šachovnici ukažme si výsledek, navíc tam kde bude "dáma" vykreslí dámu, vykreslení se provede pomocí HTML značek IMG. Kontrol bude mít jeden (náš) vstup, tím bude nastavení vlastnosti _DataSource8Q, která je typu DataSet. DataSet (jedna věc z ADO.NET) je speciální datová struktura typu 'tabulka'. Má řádky, sloupce. Je to nejčastěji používaná struktura při práci s databázi. DataSet si zjednodušeně představme jako tabulku která má řádky a sloupečky. Sloupce bývají homogení, tj. jsou jednoho typu např. řetězec (System.String) číslo (System.Int32) boolean apod. Navíc DataSet není pouze jedna tabulka, ale může mít více tabulek. Obecně se k nějaké hodnotě v datasetu dostaneme např. Název InstanceDataSe­tu.Tables[čís­lo/nebo název tabulky].Rows[čís­lo_řádku].Ite­mArray[číslo_slou­pce].ToString() třebas převedením do tisknutelného řetězce. Tak snad je to jasné :-), pokud ne tak to objasní příklad, což je úplnný zdroj našeho kontrolu. Má přepsanou metodu Render, kde se můžeme ukázat co v nás je a celý kontrol "sami vyrenderovat". je to sice pracné, zato můžeme ihned v cyklu reagovat na hodnotu v DataSetu (je/není dáma), můžeme tak přesně vytvořit barevné odlišení políček šachovnice apod. Ve funkci jsou použité dva cykly, vnořený nám "běhá" po sloupcích, vnější pak určuje řádky. Všimněme si také objektu StringBuilder ze jmenného prostoru System.Text. Tento objekt je speciálně navržen k řetězení velkých řetězců, umí dynamicky měnit paměťové zdroje.

soubor ShowDesk.ascx:
---------------------
<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Text" %>
<script language="C#" runat="server">
int _intDesk = 0;
public DataSet _DataSource8Q = null;

protected override void Render(HtmlTextWriter output)
{
  if (_DataSource8Q != null)
  {
     StringBuilder sbHTML = new StringBuilder("<TABLE border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"border: #aaaaaa 3px solid outset;\">");

     // cyklujeme vsemi radky
     for (int i=0; i<8; i++)                     // cyklujeme vsemi radky
     {
        sbHTML.Append("<TR>");

        if (i==0)
        {
          sbHTML.Append("<TD rowspan=\"9\"><img src=\"img/desk_l.gif\"></TD>");
        }

        // cyklujeme vsemi sloupci
        for (int j=0; j<8; j++)
        {
          if ((i+j) % 2 == 1)
          {
             sbHTML.Append("<TD width=\"60\" height=\"60\" background=\"img/cel"+ (i+j) % 2 +".gif\">");
             if ((int) _DataSource8Q.Tables[_intDesk].Rows[j][7-i] == 1)
             {
               sbHTML.Append("<IMG src=\"img/dama"+ (i+j) % 2 +".gif\">");
             }
             sbHTML.Append("</TD>");
          }
          else
          {
             sbHTML.Append("<TD width=\"60\" height=\"60\" background=\"img/cel"+ (i+j) % 2 +".gif\">");
             if ((int) _DataSource8Q.Tables[_intDesk].Rows[j][7-i] == 1)
             {
               sbHTML.Append("<IMG src=\"img/dama"+ (i+j) % 2 +".gif\">");
             }
             sbHTML.Append("</TD>");
          }
        }
        sbHTML.Append("</TR>");
     }
     sbHTML.Append("<TR>");
     sbHTML.Append("<TD colspan=\"8\"><img src=\"img/desk_d.gif\"></TD>");
     sbHTML.Append("</TR>");
     sbHTML.Append("</TABLE>");
     output.Write(sbHTML);
  }
}

</script>

Tak, jak takový kontrol zabudujeme do libovolné ASPx stránky? Slouží nám k tomu direktiva @Register. No a potom kontrolu dáme jako vstup "nějaký" (strukturovaný) DataSet, který požaduje, ale nejprve ho vytvoříme. No pokud DataSet neděláme z např. XML souboru nebo nějakým dotazem do databáze, kde dostaneme nějaký typový DataSet, ale "ručně" tak nás to bude stát nějakou prácičku. Vytvoříme instanci objektu DataSet – globální proměnna "Desk". Metoda AddDesk pak s tímto datasetem pracuje, přidává tabulku a hodnoty, snažil jsem se kód v metodě popsat komentáři. Metoda "Sachovnice" pak jenom volá metodu AddDesk a vytvoří jedno z možných řešení úlohy rozmístění 8 dam, které si plně vyřešíme v dalších dílech.

<%@Import Namespace="System.Data" %>
<%@Register TagPrefix="uc1" TagName="ShowDesk" Src="ShowDesk.ascx" %>
<html>
<script language="C#" runat="server">

public DataSet Desk = new DataSet();


public void Sachovnice()
{

  // Put user code to initialize the page here
  AddDesk();

  Desk.Tables[0].Rows[0][0] = 0;
  Desk.Tables[0].Rows[0][1] = 0;
  ...
  Desk.Tables[0].Rows[7][6] = 0;
  Desk.Tables[0].Rows[7][7] = 0;

}

private void AddDesk()
{
  // vezmeme pocet dosavadnich tabulek ve strukture DataSet
  int NumTables = Desk.Tables.Count;
  // pridej do datasetu novou tabulku
  Desk.Tables.Add("" + NumTables);
  // pridame osm sloupu typu int
  for (int i=0; i<8; i++)
  {
   Desk.Tables[NumTables].Columns.Add("id" + i, Type.GetType("System.Int32"));
  }
  // vloz osm radku s nulovymi hodnotami ve sloupcich
  for (int i=0; i<8; i++)
  {
    // objekt radek
    DataRow Radek;
    // utvor strukturu radku z tabulky datasetu
    Radek = Desk.Tables[NumTables].NewRow();
    // pro vsech osm sloupcu nastavime nulove hodnty
    for (int j=0; j<8; j++)
    {
      // pocatecni nulove hodnoty pro vsech osm sloupcu
      Radek[j] = 0;
    }
    // vlozime do kolekce radku radek
    Desk.Tables[NumTables].Rows.Add(Radek);
  }
}

Startovací metoda Page_Load volá metodu a nastavuje uživatelskému kontrolu zdrojový DataSet. Metody obsluhy buttonu skryjí či zviditelní kontrol.

private void Page_Load(object sender, System.EventArgs e)
{

        Sachovnice();
        ShowDesk1._DataSource8Q = Desk;
}

void Btn_Click(object sender, System.EventArgs e)
{
        ShowDesk1.Visible = true;
}

void Btn_Click2(object sender, System.EventArgs e)
{
        ShowDesk1.Visible = false;
}

</script>

Ještě umístíme kontrol do HTML struktury naší ASPx stránky

<body style="font: 10pt verdana">
  <h3>Jednoduchy Uzivatelsky Kontrol / Nastaveni vlastnosti</h3>
  <form runat="server">
    <uc1:ShowDesk id="ShowDesk1" runat="server"></uc1:ShowDesk>
    <asp:button text="Zobrazit sachovnici" OnClick="Btn_Click" runat=server/> 
    <asp:button text="Skryt sachovnici" OnClick="Btn_Click2" runat=server/>
  </form>
</body>

Kontrol je hotový a my ho s úspěchem určitě použijeme někdy příště. Bezprostředně příště to ale nebude, protože příště si nastíníme stránkování obrázku...


 

Stáhnout

Staženo 364x (1.81 kB)

 

  Aktivity (1)

Článek pro vás napsal Michael Stavěla
Avatar
Jméno: Michael Stavěla, místo nejčastějšího pobytu: Morava, vzdělání technicko-ekonomické, záliby: rekreační sport (floorball, cyklistika, plavání), programování, šifry, příroda – poznávání nových míst, hlavně ne rutina – ať se něco děje, čím víc zm...

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
ASP.NET Web Forms
Miniatura
Následující článek
Stránkování obrázku v ASP.NET

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!