Po delší době se hlásím tu na blog se svým dalším příspěvkem. Tentokrát se mi povedlo implementovat jednoduchý ale kompletní pager. Jediné co mu musíte předat IDčka a po kolika chcete stránkovat. Původně jsem měl pager který se použil pouze jednou. To proto, že on vygeneroval volání JScriptu pro každou stránku a poté toto vložil dolů do stránkování.
Jistě si dovedete představit co to muselo mít za problém – samozřejmě to že když těch stránek bylo hodně, dole byly všechny zobrazeny v tabulce. fujtajbl! Proto se mu tam předávali ty IDčka – dnes by stačilo mu předat pouze počet stránek, se kterou tento pager stejně vnitřně pracuje, protože si ji spočítá. Když teď převádím svoje weby z SQLite DB na SQL Server DB, tak u nich opravuji to nefungovalo nebo dodělávám to co fungovalo špatně. Abyste měli představu jak to funguje, přikládám zdrojak té třídy pageru:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Trida ktera generuje strankovani.
/// </summary>
public class HtmlPagingGenerator //: HtmlGenerator
{
public List<int[]> rozrazeny = new List<int[]>();
int pocetStranek = -1;
public HtmlPagingGenerator(List<int> idcka, int raditPo) //string _dotaz,
{
int count = idcka.Count;
if (count == 0)
{
return;
}
int stranek = (count / raditPo);
int zacitNa = 0;
int i = 0;
while (true)
{
if (i == stranek)
{
raditPo = count % raditPo;
}
if (i == stranek + 1)
{
break;
}
i++;
int[] nt = new int[raditPo];
idcka.CopyTo(zacitNa, nt, 0, raditPo);
rozrazeny.Add(nt);
pocetStranek++;
zacitNa += raditPo;
}
}
private HtmlPagingGenerator()
{
// TODO: Complete member initialization
}
/// <summary>
/// Cislovani A1 je od 1
/// </summary>
/// <param name="aktStrana" />
/// <returns> </returns>
public string ReturnPage(int aktStrana)
{
int posledniIndex = rozrazeny.Count - 1;
if (aktStrana < 0 && aktStrana > posledniIndex)
{
return "Nepovolene hodnoty razeni, zrejme interni chyba aplikace";
}
return Render(aktStrana, pocetStranek);
}
/// <summary>
/// Cislovani A1 je od 1.
/// </summary>
/// <param name="aktStrana" />
/// <param name="zobrazitBefore" />
/// <param name="zobrazitNext" />
/// <returns> </returns>
public string Render(int aktStrana, int pocetStranek)
{
if (pocetStranek != 0)
{
int aktStranaIndex = aktStrana - 1;
bool zobrazitBefore = aktStranaIndex != 0;
bool zobrazitNext = aktStranaIndex != pocetStranek - 1;
//-Tecky zde budou oddeleny mezerami, nebo ne, nebudou, ale jedna trojtecka bude za 3 znaky
//-Maximalni pocet znaku bude 29
int zbyvaZnakuCelkem = 29;
int zbyvaZnakuLeft = 0;
int zbyvaZnakuRight = 0;
zbyvaZnakuCelkem -= aktStrana.ToString().Length + 2;
zbyvaZnakuLeft = zbyvaZnakuCelkem / 2;
zbyvaZnakuRight = zbyvaZnakuCelkem / 2;
List<int> stranyLeft = new List<int>();
List<int> stranyRight = new List<int>();
if (aktStrana != 1)
{
for (int i = aktStrana - 1; i > 0; i--)
{
int delkaDalsiho = i.ToString().Length + 1;
if (zbyvaZnakuLeft - delkaDalsiho > -1)
{
stranyLeft.Add(i);
zbyvaZnakuLeft -= delkaDalsiho;
}
else
{
break;
}
}
}
zbyvaZnakuRight = zbyvaZnakuRight + zbyvaZnakuLeft;
for (int i = aktStrana + 1; i < pocetStranek + 1; i++)
{
int delkaDalsiho = i.ToString().Length + 1;
if (zbyvaZnakuRight - delkaDalsiho > -1)
{
stranyRight.Add(i);
zbyvaZnakuRight -= delkaDalsiho;
}
else
{
break;
}
}
if (stranyLeft.Count != 0)
{
zbyvaZnakuLeft = zbyvaZnakuRight + zbyvaZnakuLeft;
for (int i = stranyLeft[stranyLeft.Count - 1] - 1; i > 1; i--)
{
int delkaDalsiho = i.ToString().Length + 1;
if (zbyvaZnakuLeft - delkaDalsiho > -1)
{
stranyLeft.Add(i);
zbyvaZnakuLeft -= delkaDalsiho;
}
else
{
break;
}
}
}
HtmlGenerator hg = new HtmlGenerator();
string textBeforeRapid = string.Empty;
string textBefore = string.Empty;
if (zobrazitBefore)
{
textBeforeRapid = " < <";
textBefore = " <";
}
else
{
textBeforeRapid = " ";
textBefore = " ";
}
string textNextRapid = string.Empty;
string textNext = string.Empty;
if (zobrazitNext)
{
textNextRapid = ">>";
textNext = ">";
}
else
{
textNextRapid = " ";
textNext = " ";
}
if (zobrazitBefore)
{
hg.WriteTagWithAttr("div", "class", "prev");
hg.WriteTagWithAttrs("a", "runat", "server", "id", "anchorPrevRapid", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + 1 + ");return false;");
hg.WriteRaw(textBeforeRapid);
hg.TerminateTag("a");
hg.TerminateTag("div");
hg.WriteTagWithAttr("div", "class", "prev");
int to = aktStrana - 1;
if (to < 1)
{
to = 1;
}
hg.WriteTagWithAttrs("a", "runat", "server", "id", "anchorPrev", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + to + ");return false;");
hg.WriteRaw(textBefore);
hg.TerminateTag("a");
hg.TerminateTag("div");
}
stranyLeft.Reverse();
foreach (int item in stranyLeft)
{
AppendAnchor(hg, true, item);
}
AppendAnchor(hg, false, aktStrana);
foreach (int item in stranyRight)
{
AppendAnchor(hg, true, item);
}
if (zobrazitNext)
{
hg.WriteTagWithAttr("div", "class", "next");
hg.WriteTagWithAttrs("a", "runat", "server", "id", "anchorRapid", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + pocetStranek + ");return false;");
hg.WriteRaw(textNextRapid);
hg.TerminateTag("a");
hg.TerminateTag("div");
hg.WriteTagWithAttr("div", "class", "next");
hg.WriteTagWithAttrs("a", "runat", "server", "id", "anchorNext", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + (aktStrana + 1).ToString() + ");return false;");
hg.WriteRaw(textNext);
hg.TerminateTag("a");
hg.TerminateTag("div");
}
return hg.ToString();
}
return "";
}
private static int AppendAnchor(HtmlGenerator hg, bool klikaci, int item)
{
if (klikaci)
{
hg.WriteTagWithAttrs("a", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + item + ");return false;", "class", "pagingB");
}
else
{
hg.WriteTagWithAttr("span", "class", "pagingB");
}
hg.WriteRaw(item.ToString());
if (klikaci)
{
hg.TerminateTag("a");
}
else
{
hg.TerminateTag("span");
}
hg.WriteRaw(" ");
return item;
}
/// <summary>
/// Tuto metodu pouzivej kdyz se zadne vysledky nepodari najit
/// </summary>
/// <returns> </returns>
public static string NothingFound()
{
HtmlPagingGenerator hpg = new HtmlPagingGenerator();
return hpg.Render(1, 0);
}
/// <summary>
/// Tuto metodu volej pouze tehdy, kdyz se vsechny vysledky vlezou na 1 stranu
/// </summary>
/// <returns> </returns>
public static string WoPaging()
{
HtmlPagingGenerator hpg = new HtmlPagingGenerator();
return hpg.Render(1, 0);
}
}Samozřejmě že vám tato třída nepůjde zkompilovat, protože v ní používám některé svoje vlastní třídy. A na závěr ještě obrázek jak to ve skutečnosti vypadá:
