Stránkování v ovládacím prvku DataGrid bez použití PostBack

30. července 2004

Dovedu si představit, jak řadě uživatelů jde na nervy PostBack u aplikací napsaných v dotNETu. Tento způsob reakce na uživatelské akce sice velice usnadňuje práci programátora, ale díky uživatelům vypínajícím si JavaScript činí aplikace velmi nejistými. Dnes si tedy ukážeme něco, co sice přidá vývojáři trochu práce, ale zbaví ho problémů s JavaScriptem.

Přiznám se ovšem, že i mne poněkud nešťastný způsob stránkovaní přes JavaScript dost deprimoval, zvláště když jsem potřeboval z nějakých důvodů mít otevřené různé stránky či poslat někomu odkaz na konkrétní stránku. Způsob, který vám tentokrát předvedu, spočívá v nahrazení automatického generování odkazů pro listování a zpracování událostí po kliknutí na odkaz. V příkladu se však nebude používat stránkovací logika DataGridu, tu budeme muset zcela nahradit.

Jako základ použijeme již fungující příklad z článku Stránkování v ovládacím prvku DataGrid inteligentněji a ve vizuální podobě jej doplníme o navigační odkazy (ovládací prvek Hyperlink) pro stránkováni vpřed, vzad, na začátek a na konec. Pro uživatele je docela důležitá informace, na které stránce se nachází a kolik stránek má celá sestava. K zobrazování této informace použijeme ovládací prvek Label.

<%%@ Page language=“c#“ Codebehind=“default.aspx.cs“ AutoEventWireup=“false“ Inherits=“datagrid4.WebForm1″ codePage=“1250″ enableViewState=“False%>
<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.0 Transitional//EN“ >
<HTML>
 <HEAD>
  <title>WebForm1</title>
  <meta http-equiv=“Content-Type“ content=“text/html; charset=windows-1250″>
  <meta name=“GENERATOR“ Content=“Microsoft Visual Studio .NET 7.1″>
  <meta name=“CODE_LANGUAGE“ Content=“C#“>
  <meta name=“vs_defaultClientScript“ content=“JavaScript“>
  <meta name=“vs_targetSchema“ content=“http://schemas.microsoft.com/intellisense/ie5″>
 </HEAD>
 <body>
 <form id=“Form1″ method=“post“ runat=“server“>
   <asp:DataGrid id=“DG“ runat=“server“ Width=“496px“ EnableViewState=“False“></asp:DataGrid>
<asp:HyperLink id=“prvni“ runat=“server“>|<</asp:HyperLink> 
   <asp:HyperLink id=“predchozi“ runat=“server“><<</asp:HyperLink> 
   <asp:HyperLink id=“dalsi“ runat=“server“>>></asp:HyperLink> 
   <asp:HyperLink id=“posledni“ runat=“server“>>|</asp:HyperLink> Strana
   <asp:Label id=“strana“ runat=“server“>0</asp:Label> z 
   <asp:Label id=“celkem“ runat=“server“>0</asp:Label>
  </form>
  </body>
</HTML>

Naplnění DataGridu provedeme pomocí funkce napln_datagrid, kterou máme v příkladu již z předchozího článku. Informace o požadované stránce však nyní budeme přebírat z URL a v případě, že tato informace nebude k dispozici, budeme předpokládat požadavek na první stránku.

      int page;
      if (Request[„page“] != null)
      {
       page=Convert.ToInt16(Request[„page“]);
      }
      else
      {
       page=1;
      }
      napln_datagrid(page);

Nyní možná namítnete, že by bylo vhodné ošetřit stav, kdy někdo úmyslně do URL vloží místo očekávaného čísla stránka nějaký text se záměrem poškodit náš systém. Jelikož hodnotu parametru nejprve převádíme na číslo, dojde v případě, že parametr číslo neobsahuje, k vygenerování výjimky. Já ji teď ponechávám úmyslně nezpracovanou, abyste viděli, co se stane. V reálné aplikaci samozřejmě výjimku zpracujeme a uživateli zobrazíme nějaké srozumitelné hlášení.

Z DataGridu, který je již naplněn a má nastaveny parametry, jako je číslo stránky nebo celkový počet vět, si převezmeme potřebné informace a nastavíme zobrazení informací o aktuální stránce a celkovém počtu stran. (V uložené proceduře z předchozího článku je nastaveno 10 záznamů na stránku, proto ta desítka ve výpočtu poslední strany.)

int poslednistrana=DG.VirtualItemCount/10;
    if (DG.VirtualItemCount %10 !=0) poslednistrana++;
      if (DG.CurrentPageIndex>poslednistrana)
      {
      Response.Redirect(„default.aspx“);
      }
      celkem.Text=Convert.ToString(poslednistrana);
      strana.Text=Convert.ToString(DG.CurrentPageIndex);

Povšimněte si, že je ošetřena situace, kdy nějaký vtipálek požaduje stránku, která neexistuje. Než aby aplikace dělala nesmysly, raději ho přesměrujeme zpět na první stránku. Celkový počet stránek totiž jsme schopni zjistit až během zpracování požadavku uživatele a proto nelze tomuto stavu zabránit.

Nakonec vypočteme indexy pro skoky na stránky a nastavíme je do vlastnosti „NavigateUrl“ prvku Hyperlink.

  if (DG.CurrentPageIndex<poslednistrana)
        dalsi.NavigateUrl=“default.aspx?page=“+Convert.ToString(DG.CurrentPageIndex+1);
      if (DG.CurrentPageIndex>1)
        predchozi.NavigateUrl=“default.aspx?page=“+Convert.ToString(DG.CurrentPageIndex-1);
      posledni.NavigateUrl=“default.aspx?page=“+Convert.ToString(poslednistrana);
      prvni.NavigateUrl=“default.aspx“;

Protože by uživatele možná mátla možnost kliknout na odkaz pro přechod na první stránku, když je právě na ní, či naopak na poslední stránku, když se nachází na opačném konci výpisu, provedeme jako poslední krok deaktivaci těchto nepotřebných odkazů.

  if (DG.CurrentPageIndex==1)
      {
      prvni.Enabled=false;
      predchozi.Enabled=false;
      }
      if (DG.CurrentPageIndex==poslednistrana)
      {
        posledni.Enabled=false;
        dalsi.Enabled=false;
      }
     

Tím jsme pro tentokrát skončili. Vyzkoušejte si ukázku (zdrojový kód).

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *