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
InstanceDataSetu.Tables[číslo/nebo název
tabulky].Rows[číslo_řádku].ItemArray[číslo_sloupce].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žením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 850x (1.81 kB)