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 jsou 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 zdroják 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[]> pages = new List<int[]>();
int pageCount = -1;
public HtmlPagingGenerator(List<int> ids, int itemsPerPage) //string _dotaz,
{
int count = ids.Count;
if (count == 0)
{
return;
}
int fullPages = (count / itemsPerPage);
int startAt = 0;
int i = 0;
while (true)
{
if (i == fullPages)
{
itemsPerPage = count % itemsPerPage;
}
if (i == fullPages + 1)
{
break;
}
i++;
int[] nt = new int[itemsPerPage];
ids.CopyTo(startAt, nt, 0, itemsPerPage);
pages.Add(nt);
pageCount++;
startAt += itemsPerPage;
}
}
private HtmlPagingGenerator()
{
// TODO: Complete member initialization
}
/// <summary>
/// Cislovani A1 je od 1
/// </summary>
/// <param name="currentPage" />
/// <returns> </returns>
public string ReturnPage(int currentPage)
{
int lastIndex = pages.Count - 1;
if (currentPage < 0 && currentPage > lastIndex)
{
return "Nepovolene hodnoty razeni, zrejme interni chyba aplikace";
}
return Render(currentPage, pageCount);
}
/// <summary>
/// Cislovani A1 je od 1.
/// </summary>
/// <param name="currentPage" />
/// <param name="showBefore" />
/// <param name="showNext" />
/// <returns> </returns>
public string Render(int currentPage, int pageCount)
{
if (pageCount != 0)
{
int currentPageIndex = currentPage - 1;
bool showBefore = currentPageIndex != 0;
bool showNext = currentPageIndex != pageCount - 1;
//-Tecky zde budou oddeleny mezerami, nebo ne, nebudou, ale jedna trojtecka bude za 3 znaky
//-Maximalni pocet znaku bude 29
int remainingCharsTotal = 29;
int remainingCharsLeft = 0;
int remainingCharsRight = 0;
remainingCharsTotal -= currentPage.ToString().Length + 2;
remainingCharsLeft = remainingCharsTotal / 2;
remainingCharsRight = remainingCharsTotal / 2;
List<int> pagesLeft = new List<int>();
List<int> pagesRight = new List<int>();
if (currentPage != 1)
{
for (int i = currentPage - 1; i > 0; i--)
{
int nextLength = i.ToString().Length + 1;
if (remainingCharsLeft - nextLength > -1)
{
pagesLeft.Add(i);
remainingCharsLeft -= nextLength;
}
else
{
break;
}
}
}
remainingCharsRight = remainingCharsRight + remainingCharsLeft;
for (int i = currentPage + 1; i < pageCount + 1; i++)
{
int nextLength = i.ToString().Length + 1;
if (remainingCharsRight - nextLength > -1)
{
pagesRight.Add(i);
remainingCharsRight -= nextLength;
}
else
{
break;
}
}
if (pagesLeft.Count != 0)
{
remainingCharsLeft = remainingCharsRight + remainingCharsLeft;
for (int i = pagesLeft[pagesLeft.Count - 1] - 1; i > 1; i--)
{
int nextLength = i.ToString().Length + 1;
if (remainingCharsLeft - nextLength > -1)
{
pagesLeft.Add(i);
remainingCharsLeft -= nextLength;
}
else
{
break;
}
}
}
HtmlGenerator htmlGenerator = new HtmlGenerator();
string textBeforeRapid = string.Empty;
string textBefore = string.Empty;
if (showBefore)
{
textBeforeRapid = " < <";
textBefore = " <";
}
else
{
textBeforeRapid = " ";
textBefore = " ";
}
string textNextRapid = string.Empty;
string textNext = string.Empty;
if (showNext)
{
textNextRapid = ">>";
textNext = ">";
}
else
{
textNextRapid = " ";
textNext = " ";
}
if (showBefore)
{
htmlGenerator.WriteTagWithAttr("div", "class", "prev");
htmlGenerator.WriteTagWithAttrs("a", "runat", "server", "id", "anchorPrevRapid", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + 1 + ");return false;");
htmlGenerator.WriteRaw(textBeforeRapid);
htmlGenerator.TerminateTag("a");
htmlGenerator.TerminateTag("div");
htmlGenerator.WriteTagWithAttr("div", "class", "prev");
int to = currentPage - 1;
if (to < 1)
{
to = 1;
}
htmlGenerator.WriteTagWithAttrs("a", "runat", "server", "id", "anchorPrev", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + to + ");return false;");
htmlGenerator.WriteRaw(textBefore);
htmlGenerator.TerminateTag("a");
htmlGenerator.TerminateTag("div");
}
pagesLeft.Reverse();
foreach (int item in pagesLeft)
{
AppendAnchor(htmlGenerator, true, item);
}
AppendAnchor(htmlGenerator, false, currentPage);
foreach (int item in pagesRight)
{
AppendAnchor(htmlGenerator, true, item);
}
if (showNext)
{
htmlGenerator.WriteTagWithAttr("div", "class", "next");
htmlGenerator.WriteTagWithAttrs("a", "runat", "server", "id", "anchorRapid", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + pageCount + ");return false;");
htmlGenerator.WriteRaw(textNextRapid);
htmlGenerator.TerminateTag("a");
htmlGenerator.TerminateTag("div");
htmlGenerator.WriteTagWithAttr("div", "class", "next");
htmlGenerator.WriteTagWithAttrs("a", "runat", "server", "id", "anchorNext", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + (currentPage + 1).ToString() + ");return false;");
htmlGenerator.WriteRaw(textNext);
htmlGenerator.TerminateTag("a");
htmlGenerator.TerminateTag("div");
}
return htmlGenerator.ToString();
}
return "";
}
private static int AppendAnchor(HtmlGenerator htmlGenerator, bool clickable, int item)
{
if (clickable)
{
htmlGenerator.WriteTagWithAttrs("a", "href", "javascript:", "onclick", "VypsatVysledkyNaStrance(" + item + ");return false;", "class", "pagingB");
}
else
{
htmlGenerator.WriteTagWithAttr("span", "class", "pagingB");
}
htmlGenerator.WriteRaw(item.ToString());
if (clickable)
{
htmlGenerator.TerminateTag("a");
}
else
{
htmlGenerator.TerminateTag("span");
}
htmlGenerator.WriteRaw(" ");
return item;
}
/// <summary>
/// Tuto metodu pouzivej kdyz se zadne vysledky nepodari najit
/// </summary>
/// <returns> </returns>
public static string NothingFound()
{
HtmlPagingGenerator pagingGenerator = new HtmlPagingGenerator();
return pagingGenerator.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 pagingGenerator = new HtmlPagingGenerator();
return pagingGenerator.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á:
