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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
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: