HTML stránkovač hotov

⚠️ Pozor: obrázky z tohoto příspěvku se ztratily při výpadku v roce 2016. Chybějící obrázky nahradí automaticky vtipným placeholderem plugin Broken Image Placeholder.

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:

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[]> 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á:

Html Pager Hotov

Leave a Reply

Your email address will not be published. Required fields are marked *