HTML strankovac hotov

Po delsi dobe se hlasim tu na blog se svym dalsim prispevkem. Tentokrat se mi povedlo implementovat jednoduchy ale kompletni pager. Jedine co mu musite predat IDcka a po kolika chcete strankovat. Puvodne jsem mel pager ktery se pouzil pouze jednou. To proto, ze on vygeneroval volani JScriptu pro kazdou stranku a pote toto vlozil dolu do strankovani.

Jiste si dovedete predstavit co to muselo mit za problem – samozrejme to ze kdyz tech stranek bylo hodne, dole byly vsechny zobrazeny v tabulce. fujtajbl! Proto se mu tam predavali ty IDcka – dnes by stacilo mu predat pouze pocet stranek, se kterou tento pager stejne vnitrne pracuje, protoze si ji spocita. Kdyz ted prevadim svoje weby z SQLite DB na SQL Server DB, tak u nich opravuji to nefungovalo nebo dodelavam to co fungovalo spatne. Abyste meli predstavu jak to funguje, prikladam zdrojak ten tridy 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);
    }
}

Samozrejme ze vam tato trida nepujde zkompilovat, protoze v ni pouzivam nektere svoje vlastni tridy. A na zaver jeste obrazek jak to ve skutecnosti vypada:

Html Pager Hotov

Leave a Reply