HTML stránkovač hotov

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:

C#
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á:

Html Pager Hotov

Napsat komentář