English versionEnglish
博杨计算机有限公司

AspNetPager分页控件

AspNetPager源代码—Helper.cs

    1 //AspNetPager分页控件源代码:

    2 //版权所有:陕西省延安市吴起县博杨计算机有限公司 杨涛(Webdiyer)

    3 //此源代码仅供学习参考,不得用于任何商业用途;

    4 //您可以修改并重新编译该控件,但源代码中的版权信息必须原样保留!

    5 //有关控件升级及新控件发布信息,请留意 www.webdiyer.com 。

    6 

    7 using System;

    8 using System.Collections.Specialized;

    9 using System.IO;

   10 using System.Text;

   11 using System.Web.UI;

   12 using System.Web.UI.WebControls;

   13 using System.Text.RegularExpressions;

   14 

   15 namespace Wuqi.Webdiyer

   16 {

   17     public partial class AspNetPager

   18     {

   19         #region Private Helper Functions

   20 

   21         static void addMoreListItem(HtmlTextWriter writer, int pageIndex)

   22         {

   23             writer.Write("<option value=\"");

   24             writer.Write(pageIndex);

   25             writer.Write("\">......</option>");

   26         }

   27 

   28         void listPageIndices(HtmlTextWriter writer, int startIndex, int endIndex)

   29         {

   30             for (int i = startIndex; i <= endIndex; i++)

   31             {

   32                 writer.Write("<option value=\"");

   33                 writer.Write(i);

   34                 writer.Write("\"");

   35                 if (i == CurrentPageIndex)

   36                     writer.Write(" selected=\"true\"");

   37                 writer.Write(">");

   38                 writer.Write(i);

   39                 writer.Write("</option>");

   40             }

   41         }

   42 

   43         private void RenderCustomInfoSection(HtmlTextWriter writer)

   44         {

   45             if (Height != Unit.Empty)

   46                 writer.AddStyleAttribute(HtmlTextWriterStyle.Height, Height.ToString());

   47             string customUnit = CustomInfoSectionWidth.ToString();

   48             if (CustomInfoClass != null && CustomInfoClass.Trim().Length > 0)

   49                 writer.AddAttribute(HtmlTextWriterAttribute.Class, CustomInfoClass);

   50             if (CustomInfoStyle != null && CustomInfoStyle.Trim().Length > 0)

   51                 writer.AddAttribute(HtmlTextWriterAttribute.Style, CustomInfoStyle);

   52             writer.AddStyleAttribute(HtmlTextWriterStyle.Width, customUnit);

   53             if (CustomInfoTextAlign != HorizontalAlign.NotSet)

   54                 writer.AddAttribute(HtmlTextWriterAttribute.Align, CustomInfoTextAlign.ToString().ToLower());

   55             if (LayoutType == LayoutType.Div)

   56             {

   57                 writer.AddStyleAttribute("float", "left");

   58                 writer.RenderBeginTag(HtmlTextWriterTag.Div);

   59             }

   60             else

   61             {

   62                 writer.AddAttribute(HtmlTextWriterAttribute.Valign, "bottom");

   63                 writer.AddAttribute(HtmlTextWriterAttribute.Nowrap, "true");

   64                 writer.RenderBeginTag(HtmlTextWriterTag.Td);

   65             }

   66             writer.Write(GetCustomInfoHtml(CustomInfoHTML));

   67             writer.RenderEndTag();

   68         }

   69 

   70         private void RenderNavigationSection(HtmlTextWriter writer)

   71         {

   72             if (CustomInfoSectionWidth.Type == UnitType.Percentage)

   73             {

   74                 writer.AddStyleAttribute(HtmlTextWriterStyle.Width,

   75                                          (Unit.Percentage(100 - CustomInfoSectionWidth.Value)).ToString());

   76             }

   77             if (HorizontalAlign != HorizontalAlign.NotSet)

   78                 writer.AddAttribute(HtmlTextWriterAttribute.Align, HorizontalAlign.ToString().ToLower());

   79             if (!string.IsNullOrEmpty(CssClass))

   80                 writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClass);

   81             if (LayoutType == LayoutType.Div)

   82             {

   83                 writer.AddStyleAttribute("float", "left");

   84                 writer.RenderBeginTag(HtmlTextWriterTag.Div); //<div>

   85             }

   86             else

   87             {

   88                 writer.AddAttribute(HtmlTextWriterAttribute.Valign, "bottom");

   89                 writer.AddAttribute(HtmlTextWriterAttribute.Nowrap, "true");

   90                 writer.RenderBeginTag(HtmlTextWriterTag.Td); //<td>

   91             }

   92             RenderPagingElements(writer);

   93             writer.RenderEndTag(); //</div> or </td>

   94         }

   95 

   96         private void RenderPagingElements(HtmlTextWriter writer)

   97         {

   98             int startIndex = ((CurrentPageIndex - 1)/NumericButtonCount)*NumericButtonCount;

   99                 //this is an important trick, it's not the same as CurrentPageIndex-1

  100             if (PageCount > NumericButtonCount && CurrentPageButtonPosition != PagingButtonPosition.Fixed)

  101             {

  102                 switch (CurrentPageButtonPosition)

  103                 {

  104                     case PagingButtonPosition.End:

  105                         if (CurrentPageIndex > NumericButtonCount)

  106                             startIndex = CurrentPageIndex - NumericButtonCount;

  107                         break;

  108                     case PagingButtonPosition.Center:

  109                         int startOffset = CurrentPageIndex - (int) (Math.Ceiling((double) NumericButtonCount/2));

  110                         if (startOffset > 0)

  111                         {

  112                             startIndex = startOffset;

  113                             if (startIndex > (PageCount - NumericButtonCount))

  114                                 startIndex = PageCount - NumericButtonCount;

  115                         }

  116                         break;

  117                     case PagingButtonPosition.Beginning:

  118                         startIndex = CurrentPageIndex - 1;

  119                         if (startIndex + NumericButtonCount > PageCount)

  120                             startIndex = PageCount - NumericButtonCount;

  121                         break;

  122                 }

  123             }

  124 

  125             int endIndex = ((startIndex + NumericButtonCount) > PageCount)

  126                                ? PageCount

  127                                : (startIndex + NumericButtonCount);

  128 

  129             if (PagingButtonLayoutType == PagingButtonLayoutType.UnorderedList)

  130                 writer.RenderBeginTag(HtmlTextWriterTag.Ul); //<ul>

  131 

  132             if (NavigationButtonsPosition == NavigationButtonPosition.Left ||

  133                 NavigationButtonsPosition == NavigationButtonPosition.BothSides)

  134             {

  135                 CreateNavigationButton(writer, NavigationButton.First);

  136                 CreateNavigationButton(writer, NavigationButton.Prev);

  137                 if (NavigationButtonsPosition == NavigationButtonPosition.Left)

  138                 {

  139                     CreateNavigationButton(writer, NavigationButton.Next);

  140                     CreateNavigationButton(writer, NavigationButton.Last);

  141                 }

  142             }

  143 

  144             if (AlwaysShowFirstLastPageNumber && startIndex > 1)

  145                 CreateNumericButton(writer, 1);

  146 

  147             if (ShowMoreButtons && startIndex > 0)

  148                 CreateMoreButton(writer, startIndex);

  149             if (ShowPageIndex)

  150             {

  151                 for (int i = startIndex + 1; i <= endIndex; i++)

  152                 {

  153                     CreateNumericButton(writer, i);

  154                 }

  155             }

  156             if (ShowMoreButtons && PageCount > NumericButtonCount && endIndex < PageCount)

  157                 CreateMoreButton(writer, endIndex + 1);

  158 

  159             if (AlwaysShowFirstLastPageNumber && endIndex < PageCount)

  160                 CreateNumericButton(writer, PageCount);

  161 

  162             if (NavigationButtonsPosition == NavigationButtonPosition.Right ||

  163                 NavigationButtonsPosition == NavigationButtonPosition.BothSides)

  164             {

  165                 if (NavigationButtonsPosition == NavigationButtonPosition.Right)

  166                 {

  167                     CreateNavigationButton(writer, NavigationButton.First);

  168                     CreateNavigationButton(writer, NavigationButton.Prev);

  169                 }

  170                 CreateNavigationButton(writer, NavigationButton.Next);

  171                 CreateNavigationButton(writer, NavigationButton.Last);

  172             }

  173 

  174             if (PagingButtonLayoutType == PagingButtonLayoutType.UnorderedList)

  175                 writer.RenderEndTag(); //</ul>

  176 

  177 

  178             if ((ShowPageIndexBox == ShowPageIndexBox.Always) ||

  179                 (ShowPageIndexBox == ShowPageIndexBox.Auto && PageCount >= ShowBoxThreshold))

  180             {

  181                 string boxClientId = UniqueID + "_input";

  182                 writer.Write("&nbsp;&nbsp;");

  183                 if (!string.IsNullOrEmpty(TextBeforePageIndexBox))

  184                     writer.Write(TextBeforePageIndexBox);

  185                 if (PageIndexBoxType == PageIndexBoxType.TextBox) //TextBox

  186                 {

  187                     writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");

  188                     writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "30px");

  189                     writer.AddAttribute(HtmlTextWriterAttribute.Value, CurrentPageIndex.ToString());

  190                     if (!string.IsNullOrEmpty(PageIndexBoxStyle))

  191                         writer.AddAttribute(HtmlTextWriterAttribute.Style, PageIndexBoxStyle);

  192                     if (!string.IsNullOrEmpty(PageIndexBoxClass))

  193                         writer.AddAttribute(HtmlTextWriterAttribute.Class, PageIndexBoxClass);

  194                     if (!Enabled || (PageCount <= 1 && AlwaysShow))

  195                         writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");

  196                     writer.AddAttribute(HtmlTextWriterAttribute.Name, boxClientId);

  197                     writer.AddAttribute(HtmlTextWriterAttribute.Id, boxClientId);

  198                     string chkInputScript = "ANP_checkInput(\'" + boxClientId + "\'," + PageCount + ")";

  199                     string keydownScript = "ANP_keydown(event,\'" + UniqueID + "_btn\');";

  200                     string clickScript = "if(" + chkInputScript + "){ANP_goToPage(document.getElementById(\'" +

  201                                          boxClientId + "\'));};return false;";

  202 

  203                     writer.AddAttribute("onkeydown", keydownScript);

  204                     writer.RenderBeginTag(HtmlTextWriterTag.Input);

  205                     writer.RenderEndTag();

  206                     //Text after page index box

  207                     if (!string.IsNullOrEmpty(TextAfterPageIndexBox))

  208                         writer.Write(TextAfterPageIndexBox);

  209 

  210                     //button

  211                     if (!string.IsNullOrEmpty(SubmitButtonImageUrl))

  212                     {

  213                         writer.AddAttribute(HtmlTextWriterAttribute.Type, "image");

  214                         writer.AddAttribute(HtmlTextWriterAttribute.Src, SubmitButtonImageUrl);

  215                     }

  216                     else

  217                     {

  218                         writer.AddAttribute(HtmlTextWriterAttribute.Type, UrlPaging ? "button" : "submit");

  219                         writer.AddAttribute(HtmlTextWriterAttribute.Value, SubmitButtonText);

  220                     }

  221                     writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID);

  222                     writer.AddAttribute(HtmlTextWriterAttribute.Id, UniqueID + "_btn");

  223                     if (!string.IsNullOrEmpty(SubmitButtonClass))

  224                         writer.AddAttribute(HtmlTextWriterAttribute.Class, SubmitButtonClass);

  225                     if (!string.IsNullOrEmpty(SubmitButtonStyle))

  226                         writer.AddAttribute(HtmlTextWriterAttribute.Style, SubmitButtonStyle);

  227                     if (!Enabled || (PageCount <= 1 && AlwaysShow))

  228                         writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");

  229                     writer.AddAttribute(HtmlTextWriterAttribute.Onclick,

  230                                         (UrlPaging)

  231                                             ? clickScript

  232                                             : "if(" + chkInputScript + "){" +

  233                                               Page.ClientScript.GetPostBackEventReference(this, null) +

  234                                               "} else{return false}");

  235                     writer.RenderBeginTag(HtmlTextWriterTag.Input);

  236                     writer.RenderEndTag();

  237                 }

  238                 else //Dropdownlist

  239                 {

  240                     writer.AddAttribute(HtmlTextWriterAttribute.Name, boxClientId);

  241                     writer.AddAttribute(HtmlTextWriterAttribute.Id, boxClientId);

  242                     writer.AddAttribute(HtmlTextWriterAttribute.Onchange,

  243                                         UrlPaging

  244                                             ? "ANP_goToPage(this)"

  245                                             : Page.ClientScript.GetPostBackEventReference(this, null));

  246                     if (!string.IsNullOrEmpty(PageIndexBoxStyle))

  247                         writer.AddAttribute(HtmlTextWriterAttribute.Style, PageIndexBoxStyle);

  248                     if (!string.IsNullOrEmpty(PageIndexBoxClass))

  249                         writer.AddAttribute(HtmlTextWriterAttribute.Class, PageIndexBoxClass);

  250                     writer.RenderBeginTag(HtmlTextWriterTag.Select);

  251                     if (PageCount > 80) //list only part of page indices

  252                     {

  253                         if (CurrentPageIndex <= 15)

  254                         {

  255                             listPageIndices(writer, 1, 15);

  256                             addMoreListItem(writer, 16);

  257                             listPageIndices(writer, PageCount - 4, PageCount);

  258                         }

  259                         else if (CurrentPageIndex >= PageCount - 14)

  260                         {

  261                             listPageIndices(writer, 1, 5);

  262                             addMoreListItem(writer, PageCount - 15);

  263                             listPageIndices(writer, PageCount - 14, PageCount);

  264                         }

  265                         else

  266                         {

  267                             listPageIndices(writer, 1, 5);

  268                             addMoreListItem(writer, CurrentPageIndex - 6);

  269                             listPageIndices(writer, CurrentPageIndex - 5, CurrentPageIndex + 5);

  270                             addMoreListItem(writer, CurrentPageIndex + 6);

  271                             listPageIndices(writer, PageCount - 4, PageCount);

  272                         }

  273                     }

  274                     else //list all page indices

  275                         listPageIndices(writer, 1, PageCount);

  276                     writer.RenderEndTag();

  277                     if (!string.IsNullOrEmpty(TextAfterPageIndexBox))

  278                         writer.Write(TextAfterPageIndexBox);

  279                 }

  280             }

  281         }

  282 

  283         /// <summary>

  284         /// Get the navigation url for the paging button.

  285         /// </summary>

  286         /// <param name="pageIndex">the page index correspond to the button.</param>

  287         /// <returns>href string for the paging navigation button.</returns>

  288         private string GetHrefString(int pageIndex)

  289         {

  290             if (UrlPaging)

  291             {

  292                 int urlPageIndex = pageIndex;

  293                 string jsValue = "pi";

  294                 if (ReverseUrlPageIndex)

  295                 {

  296                     jsValue = "(" + PageCount + "-pi+1)";

  297                     urlPageIndex = pageIndex == -1 ? -1 : PageCount - pageIndex + 1;

  298                 }

  299                 if (EnableUrlRewriting)

  300                 {

  301                     Regex reg = new Regex("(?<p>%(?<m>[^%]+)%)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

  302                     MatchCollection mts = reg.Matches(UrlRewritePattern);

  303                     string prmValue;

  304                     NameValueCollection urlParams = ConvertQueryStringToCollection(queryString);

  305                     string url = UrlRewritePattern;

  306                     foreach (Match m in mts)

  307                     {

  308                         prmValue = urlParams[m.Groups["m"].Value];

  309                         //if (!string.IsNullOrEmpty(prmValue))

  310                             url = url.Replace(m.Groups["p"].Value, prmValue);

  311                     }

  312                     return ResolveUrl(string.Format(url, (urlPageIndex == -1) ? "\"+" + jsValue + "+\"" : urlPageIndex.ToString()));

  313                 }

  314                 else

  315                 {

  316                     return BuildUrlString(UrlPageIndexName, (urlPageIndex == -1) ? "\"+" + jsValue + "+\"" : urlPageIndex.ToString());

  317                 }

  318             }

  319             return Page.ClientScript.GetPostBackClientHyperlink(this, pageIndex.ToString());

  320         }

  321 

  322         /// <summary>

  323         /// Replace the property placeholders in the CustomInfoHTML with the property values repectively

  324         /// </summary>

  325         /// <param name="origText">original CustomInfoHTML</param>

  326         /// <returns></returns>

  327         private string GetCustomInfoHtml(string origText)

  328         {

  329             if (!string.IsNullOrEmpty(origText) && origText.IndexOf('%') >= 0)

  330             {

  331                 string[] props = new string[] { "recordcount", "pagecount", "currentpageindex", "startrecordindex", "endrecordindex", "pagesize", "pagesremain", "recordsremain" };

  332                 StringBuilder sb = new StringBuilder(origText);

  333                 Regex reg = new Regex("(?<ph>%(?<pname>\\w{8,})%)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

  334                 MatchCollection mts = reg.Matches(origText);

  335                 foreach (Match m in mts)

  336                 {

  337                     string p = m.Groups["pname"].Value.ToLower();

  338                     if (Array.IndexOf(props, p) >= 0)

  339                     {

  340                         string repValue = null;

  341                         switch (p)

  342                         {

  343                             case "recordcount":

  344                                 repValue = RecordCount.ToString(); break;

  345                             case "pagecount":

  346                                 repValue = PageCount.ToString(); break;

  347                             case "currentpageindex":

  348                                 repValue = CurrentPageIndex.ToString(); break;

  349                             case "startrecordindex":

  350                                 repValue = StartRecordIndex.ToString(); break;

  351                             case "endrecordindex":

  352                                 repValue = EndRecordIndex.ToString(); break;

  353                             case "pagesize":

  354                                 repValue = PageSize.ToString(); break;

  355                             case "pagesremain":

  356                                 repValue = PagesRemain.ToString(); break;

  357                             case "recordsremain":

  358                                 repValue = RecordsRemain.ToString(); break;

  359                         }

  360                         if (repValue != null)

  361                             sb.Replace(m.Groups["ph"].Value, repValue);

  362                     }

  363                 }

  364                 return sb.ToString();

  365             }

  366             return origText;

  367         }

  368 

  369         /// <summary>

  370         /// Convert raw query string to NameValueCollection

  371         /// </summary>

  372         /// <param name="s">raw query string</param>

  373         private static NameValueCollection ConvertQueryStringToCollection(string s)

  374         {

  375             NameValueCollection prms = new NameValueCollection();

  376             int num = (s != null) ? s.Length : 0;

  377             for (int i = 0; i < num; i++)

  378             {

  379                 int startIndex = i;

  380                 int num4 = -1;

  381                 while (i < num)

  382                 {

  383                     char ch = s[i];

  384                     if (ch == '=')

  385                     {

  386                         if (num4 < 0)

  387                         {

  388                             num4 = i;

  389                         }

  390                     }

  391                     else if (ch == '&')

  392                     {

  393                         break;

  394                     }

  395                     i++;

  396                 }

  397                 string skey = null;

  398                 string svalue;

  399                 if (num4 >= 0)

  400                 {

  401                     skey = s.Substring(startIndex, num4 - startIndex);

  402                     svalue = s.Substring(num4 + 1, (i - num4) - 1);

  403                 }

  404                 else

  405                 {

  406                     svalue = s.Substring(startIndex, i - startIndex);

  407                 }

  408                 prms.Add(skey, svalue);

  409                 if ((i == (num - 1)) && (s[i] == '&'))

  410                 {

  411                     prms.Add(null, string.Empty);

  412                 }

  413             }

  414             return prms;

  415         }

  416 

  417         /// <summary>

  418         /// add paging parameter and value to the current url or change parameter value if it already exists when using url paging mode

  419         /// </summary>

  420         /// <param name="sk">name of the url parameter to be added</param>

  421         /// <param name="sv">value of the url paramter to be added</param>

  422         /// <returns>href string for the navigattion button</returns>

  423         private string BuildUrlString(string sk, string sv)

  424         {

  425             StringBuilder ubuilder = new StringBuilder(80);

  426             bool keyFound = false;

  427             int num = (queryString != null) ? queryString.Length : 0;

  428             for (int i = 0; i < num; i++)

  429             {

  430                 int startIndex = i;

  431                 int num4 = -1;

  432                 while (i < num)

  433                 {

  434                     char ch = queryString[i];

  435                     if (ch == '=')

  436                     {

  437                         if (num4 < 0)

  438                         {

  439                             num4 = i;

  440                         }

  441                     }

  442                     else if (ch == '&')

  443                     {

  444                         break;

  445                     }

  446                     i++;

  447                 }

  448                 string skey = null;

  449                 string svalue;

  450                 if (num4 >= 0)

  451                 {

  452                     skey = queryString.Substring(startIndex, num4 - startIndex);

  453                     svalue = queryString.Substring(num4 + 1, (i - num4) - 1);

  454                 }

  455                 else

  456                 {

  457                     svalue = queryString.Substring(startIndex, i - startIndex);

  458                 }

  459                 ubuilder.Append(skey).Append("=");

  460                 if (skey == sk)

  461                 {

  462                     keyFound = true;

  463                     ubuilder.Append(sv);

  464                 }

  465                 else

  466                     ubuilder.Append(svalue);

  467                 ubuilder.Append("&");

  468             }

  469             if (!keyFound)

  470                 ubuilder.Append(sk).Append("=").Append(sv);

  471             ubuilder.Insert(0, "?").Insert(0, Path.GetFileName(currentUrl));

  472             return ubuilder.ToString().Trim('&');

  473         }

  474 

  475         /// <summary>

  476         /// Create first, prev, next or last button.

  477         /// </summary>

  478         /// <param name="writer">A <see cref="System.Web.UI.HtmlTextWriter"/> that represents the output stream to render HTML content on the client.</param>

  479         /// <param name="btn">the navigation button</param>

  480         private void CreateNavigationButton(HtmlTextWriter writer, NavigationButton btn)

  481         {

  482             if (!ShowFirstLast && (btn == NavigationButton.First || btn == NavigationButton.Last))

  483                 return;

  484             if (!ShowPrevNext && (btn == NavigationButton.Prev || btn == NavigationButton.Next))

  485                 return;

  486 

  487             if (PagingButtonLayoutType != PagingButtonLayoutType.None) //add css class and style attribute to pager item directly

  488             {

  489                 if (btn == NavigationButton.First || btn == NavigationButton.Last) //first page or last page button

  490                     AddClassAndStyle(FirstLastButtonsClass, FirstLastButtonsStyle, writer);

  491                 else

  492                     AddClassAndStyle(PrevNextButtonsClass, PrevNextButtonsStyle, writer);//next page or prevous page button

  493             }

  494             AddPagingButtonLayoutTag(writer); //<li> or <span>

  495 

  496             string linktext;

  497             bool disabled;

  498             int pageIndex;

  499             string btnname = btn.ToString().ToLower();

  500             bool isImgBtn = (//PagingButtonType == PagingButtonType.Image &&

  501                               NavigationButtonType == PagingButtonType.Image);

  502             if (btn == NavigationButton.First || btn == NavigationButton.Prev)

  503             {

  504                 disabled = (CurrentPageIndex <= 1) | !Enabled;

  505                 if (!ShowDisabledButtons && disabled)

  506                     return;

  507                 pageIndex = (btn == NavigationButton.First) ? 1 : (CurrentPageIndex - 1);

  508                 writeSpacingStyle(writer);

  509                 if (PagingButtonLayoutType == PagingButtonLayoutType.None) //add css class and style attribute to pager item directly

  510                 {

  511                     if (btn == NavigationButton.First || btn == NavigationButton.Last) //first page or last page button

  512                         AddClassAndStyle(FirstLastButtonsClass, FirstLastButtonsStyle, writer);

  513                     else

  514                         AddClassAndStyle(PrevNextButtonsClass, PrevNextButtonsStyle, writer);//next page or prevous page button

  515                 }

  516                 if (isImgBtn)

  517                 {

  518                     if (!disabled)

  519                     {

  520                         writer.AddAttribute("href", GetHrefString(pageIndex),false);

  521                         AddToolTip(writer, pageIndex);

  522                         AddHyperlinkTarget(writer);

  523                         writer.RenderBeginTag(HtmlTextWriterTag.A);

  524                         writer.AddAttribute(HtmlTextWriterAttribute.Src,

  525                                             String.Concat(ImagePath, btnname, ButtonImageNameExtension,

  526                                                           ButtonImageExtension));

  527                         writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");

  528                         if (ButtonImageAlign != ImageAlign.NotSet)

  529                             writer.AddAttribute(HtmlTextWriterAttribute.Align, ButtonImageAlign.ToString());

  530                         writer.RenderBeginTag(HtmlTextWriterTag.Img);

  531                         writer.RenderEndTag();

  532                         writer.RenderEndTag();

  533                     }

  534                     else

  535                     {

  536                         writer.AddAttribute(HtmlTextWriterAttribute.Src,

  537                                             String.Concat(ImagePath, btnname, DisabledButtonImageNameExtension,

  538                                                           ButtonImageExtension));

  539                         writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");

  540                         if (ButtonImageAlign != ImageAlign.NotSet)

  541                             writer.AddAttribute(HtmlTextWriterAttribute.Align, ButtonImageAlign.ToString());

  542                         writer.RenderBeginTag(HtmlTextWriterTag.Img);

  543                         writer.RenderEndTag();

  544                     }

  545                 }

  546                 else

  547                 {

  548                     linktext = (btn == NavigationButton.Prev) ? PrevPageText : FirstPageText;

  549                     if (disabled)

  550                         writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");

  551                     else

  552                     {

  553                         //WriteCssClass(writer);

  554                         AddToolTip(writer, pageIndex);

  555                         AddHyperlinkTarget(writer);

  556                         writer.AddAttribute("href", GetHrefString(pageIndex),false);

  557                     }

  558                     writer.RenderBeginTag(HtmlTextWriterTag.A);

  559                     writer.Write(linktext);

  560                     writer.RenderEndTag();

  561                 }

  562             }

  563             else

  564             {

  565                 disabled = (CurrentPageIndex >= PageCount) | !Enabled;

  566                 if (!ShowDisabledButtons && disabled)

  567                     return;

  568                 pageIndex = (btn == NavigationButton.Last) ? PageCount : (CurrentPageIndex + 1);

  569                 writeSpacingStyle(writer);

  570                 if (PagingButtonLayoutType == PagingButtonLayoutType.None) //add css class and style attribute to pager item directly

  571                 {

  572                     if (btn == NavigationButton.First || btn == NavigationButton.Last) //first page or last page button

  573                         AddClassAndStyle(FirstLastButtonsClass, FirstLastButtonsStyle, writer);

  574                     else

  575                         AddClassAndStyle(PrevNextButtonsClass, PrevNextButtonsStyle, writer);//next page or prevous page button

  576                 }

  577                 if (isImgBtn)

  578                 {

  579                     if (!disabled)

  580                     {

  581                         writer.AddAttribute("href", GetHrefString(pageIndex),false);

  582                         AddToolTip(writer, pageIndex);

  583                         AddHyperlinkTarget(writer);

  584                         writer.RenderBeginTag(HtmlTextWriterTag.A);

  585                         writer.AddAttribute(HtmlTextWriterAttribute.Src,

  586                                             String.Concat(ImagePath, btnname, ButtonImageNameExtension,

  587                                                           ButtonImageExtension));

  588                         writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");

  589                         if (ButtonImageAlign != ImageAlign.NotSet)

  590                             writer.AddAttribute(HtmlTextWriterAttribute.Align, ButtonImageAlign.ToString());

  591                         writer.RenderBeginTag(HtmlTextWriterTag.Img);

  592                         writer.RenderEndTag();

  593                         writer.RenderEndTag();

  594                     }

  595                     else

  596                     {

  597                         writer.AddAttribute(HtmlTextWriterAttribute.Src,

  598                                             String.Concat(ImagePath, btnname, DisabledButtonImageNameExtension,

  599                                                           ButtonImageExtension));

  600                         writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");

  601                         if (ButtonImageAlign != ImageAlign.NotSet)

  602                             writer.AddAttribute(HtmlTextWriterAttribute.Align, ButtonImageAlign.ToString());

  603                         writer.RenderBeginTag(HtmlTextWriterTag.Img);

  604                         writer.RenderEndTag();

  605                     }

  606                 }

  607                 else

  608                 {

  609                     linktext = (btn == NavigationButton.Next) ? NextPageText : LastPageText;

  610                     if (disabled)

  611                         writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");

  612                     else

  613                     {

  614                         //WriteCssClass(writer);

  615                         AddToolTip(writer, pageIndex);

  616                         writer.AddAttribute("href", GetHrefString(pageIndex),false);

  617                         AddHyperlinkTarget(writer);

  618                     }

  619                     writer.RenderBeginTag(HtmlTextWriterTag.A);

  620                     writer.Write(linktext);

  621                     writer.RenderEndTag();

  622                 }

  623             }

  624             if (PagingButtonLayoutType != PagingButtonLayoutType.None)

  625                 writer.RenderEndTag(); //</li> or </span>

  626         }

  627 

  628         /// <summary>

  629         /// Write css class name.

  630         /// </summary>

  631         /// <param name="writer">A <see cref="System.Web.UI.HtmlTextWriter"/> that represents the output stream to render HTML content on the client. </param>

  632         //private void WriteCssClass(HtmlTextWriter writer)

  633         //{

  634         //    if (cssClassName != null && cssClassName.Trim().Length > 0)

  635         //        writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClassName);

  636         //}

  637 

  638         /// <summary>

  639         /// Add tool tip text to navigation button.

  640         /// </summary>

  641         private void AddToolTip(HtmlTextWriter writer, int pageIndex)

  642         {

  643             if (ShowNavigationToolTip)

  644             {

  645                 writer.AddAttribute(HtmlTextWriterAttribute.Title, String.Format(NavigationToolTipTextFormatString, pageIndex));

  646             }

  647         }

  648         /// <summary>

  649         /// add paging button layout tag

  650         /// </summary>

  651         private void AddPagingButtonLayoutTag(HtmlTextWriter writer)

  652         {

  653             if (PagingButtonLayoutType == PagingButtonLayoutType.UnorderedList)

  654                 writer.RenderBeginTag(HtmlTextWriterTag.Li); //<li>

  655             else if (PagingButtonLayoutType == PagingButtonLayoutType.Span)

  656                 writer.RenderBeginTag(HtmlTextWriterTag.Span); //<span>

  657         }

  658 

  659         /// <summary>

  660         /// Create numeric paging button.

  661         /// </summary>

  662         /// <param name="writer">A <see cref="System.Web.UI.HtmlTextWriter"/> that represents the output stream to render HTML content on the client.</param>

  663         /// <param name="index">the page index correspond to the paging button</param>

  664         private void CreateNumericButton(HtmlTextWriter writer, int index)

  665         {

  666             bool isCurrent = (index == CurrentPageIndex);

  667 

  668             if ((!isCurrent && PagingButtonLayoutType != PagingButtonLayoutType.None) || (isCurrent && PagingButtonLayoutType == PagingButtonLayoutType.UnorderedList)) //current page button already wrapped in span

  669             {

  670                 if (!isCurrent) //exclude current page index button

  671                     AddClassAndStyle(PagingButtonsClass, PagingButtonsStyle, writer);

  672                 AddPagingButtonLayoutTag(writer); //<li>

  673             }

  674 

  675             if (/*PagingButtonType == PagingButtonType.Image && */NumericButtonType == PagingButtonType.Image)

  676             {

  677                 writeSpacingStyle(writer);

  678                 if (!isCurrent)

  679                 {

  680                     if (Enabled)

  681                         writer.AddAttribute("href", GetHrefString(index),false);

  682                     //if (PagingButtonLayoutType == PagingButtonLayoutType.None) //add css class and style attribute to hyper link directly

  683                         AddClassAndStyle(PagingButtonsClass, PagingButtonsStyle, writer);

  684 

  685                     AddToolTip(writer, index);

  686                     AddHyperlinkTarget(writer);

  687                     writer.RenderBeginTag(HtmlTextWriterTag.A);

  688                     CreateNumericImages(writer, index, false);

  689                     writer.RenderEndTag();

  690                 }

  691                 else

  692                 {

  693                     if (!string.IsNullOrEmpty(CurrentPageButtonClass))

  694                         writer.AddAttribute(HtmlTextWriterAttribute.Class, CurrentPageButtonClass);

  695                     if (!string.IsNullOrEmpty(CurrentPageButtonStyle))

  696                         writer.AddAttribute(HtmlTextWriterAttribute.Style, CurrentPageButtonStyle);

  697                     writer.RenderBeginTag(HtmlTextWriterTag.Span);

  698                     CreateNumericImages(writer, index, true);

  699                     writer.RenderEndTag();

  700                 }

  701             }

  702             else

  703             {

  704                 writeSpacingStyle(writer);

  705                 if (isCurrent)

  706                 {

  707                     if (string.IsNullOrEmpty(CurrentPageButtonClass) && string.IsNullOrEmpty(CurrentPageButtonStyle))

  708                     {

  709                         writer.AddStyleAttribute(HtmlTextWriterStyle.FontWeight, "Bold");

  710                         writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "red");

  711                     }

  712                     else

  713                     {

  714                         if (!string.IsNullOrEmpty(CurrentPageButtonClass))

  715                             writer.AddAttribute(HtmlTextWriterAttribute.Class, CurrentPageButtonClass);

  716                         if (!string.IsNullOrEmpty(CurrentPageButtonStyle))

  717                             writer.AddAttribute(HtmlTextWriterAttribute.Style, CurrentPageButtonStyle);

  718                     }

  719                     writer.RenderBeginTag(HtmlTextWriterTag.Span);

  720                     if (!string.IsNullOrEmpty(CurrentPageButtonTextFormatString))

  721                         writer.Write(String.Format(CurrentPageButtonTextFormatString, index));

  722                     else

  723                         writer.Write(index);

  724                     writer.RenderEndTag();

  725                 }

  726                 else

  727                 {

  728                     if (Enabled)

  729                     {

  730                         writer.AddAttribute("href", GetHrefString(index),false);

  731                         AddClassAndStyle(PagingButtonsClass, PagingButtonsStyle, writer); //add css class and style

  732                     }

  733                     //WriteCssClass(writer);

  734                     AddToolTip(writer, index);

  735                     AddHyperlinkTarget(writer);

  736                     writer.RenderBeginTag(HtmlTextWriterTag.A);

  737                     if (!string.IsNullOrEmpty(NumericButtonTextFormatString))

  738                         writer.Write(String.Format(NumericButtonTextFormatString, index));

  739                     else

  740                         writer.Write(index);

  741                     writer.RenderEndTag();

  742                 }

  743             }

  744             if ((!isCurrent && PagingButtonLayoutType != PagingButtonLayoutType.None) || (isCurrent && PagingButtonLayoutType == PagingButtonLayoutType.UnorderedList))

  745                 writer.RenderEndTag(); //</li>

  746         }

  747 

  748         /// <summary>

  749         /// Create numeric image button.

  750         /// </summary>

  751         /// <param name="writer">A <see cref="System.Web.UI.HtmlTextWriter"/> that represents the output stream to render HTML content on the client.</param>

  752         /// <param name="index">the page index correspond to the button.</param>

  753         /// <param name="isCurrent">if the page index correspond to the button is the current page index</param>

  754         private void CreateNumericImages(HtmlTextWriter writer, int index, bool isCurrent)

  755         {

  756             AddPagingButtonLayoutTag(writer); //<li> or <span>

  757 

  758             string indexStr = index.ToString();

  759             for (int i = 0; i < indexStr.Length; i++)

  760             {

  761                 writer.AddAttribute(HtmlTextWriterAttribute.Src, String.Concat(ImagePath, indexStr[i], (isCurrent) ? CpiButtonImageNameExtension : ButtonImageNameExtension, ButtonImageExtension));

  762                 if (ButtonImageAlign != ImageAlign.NotSet)

  763                     writer.AddAttribute(HtmlTextWriterAttribute.Align, ButtonImageAlign.ToString());

  764                 writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");

  765                 writer.RenderBeginTag(HtmlTextWriterTag.Img);

  766                 writer.RenderEndTag();

  767             }

  768             if (PagingButtonLayoutType != PagingButtonLayoutType.None)

  769                 writer.RenderEndTag(); //</li> or </span>

  770         }

  771 

  772         /// <summary>

  773         /// create more (...) button.

  774         /// </summary>

  775         private void CreateMoreButton(HtmlTextWriter writer, int pageIndex)

  776         {

  777             AddClassAndStyle(MoreButtonsClass, MoreButtonsStyle, writer);

  778             AddPagingButtonLayoutTag(writer); //<li> or <span>

  779 

  780             writeSpacingStyle(writer);

  781             if (Enabled)

  782             {

  783                 writer.AddAttribute("href", GetHrefString(pageIndex),false);

  784                 AddToolTip(writer, pageIndex);

  785                 AddHyperlinkTarget(writer);

  786             }

  787             writer.RenderBeginTag(HtmlTextWriterTag.A); //<a>

  788             if ( /*PagingButtonType == PagingButtonType.Image && */MoreButtonType == PagingButtonType.Image)

  789             {

  790                 writer.AddAttribute(HtmlTextWriterAttribute.Src,

  791                                     String.Concat(ImagePath, "more", ButtonImageNameExtension, ButtonImageExtension));

  792                 writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");

  793                 if (ButtonImageAlign != ImageAlign.NotSet)

  794                     writer.AddAttribute(HtmlTextWriterAttribute.Align, ButtonImageAlign.ToString());

  795                 writer.RenderBeginTag(HtmlTextWriterTag.Img); //<img>

  796                 writer.RenderEndTag(); //</img>

  797             }

  798             else

  799                 writer.Write("...");

  800 

  801             writer.RenderEndTag(); //</a>

  802 

  803             if (PagingButtonLayoutType != PagingButtonLayoutType.None)

  804                 writer.RenderEndTag(); //</li> or </span>

  805         }

  806 

  807         /// <summary>

  808         /// Add paging button spacing styles to HtmlTextWriter

  809         /// </summary>

  810         private void writeSpacingStyle(HtmlTextWriter writer)

  811         {

  812             if (PagingButtonSpacing.Value != 0)

  813                 writer.AddStyleAttribute(HtmlTextWriterStyle.MarginRight, PagingButtonSpacing.ToString());

  814         }

  815 

  816         /// <summary>

  817         /// add target attribute to paging hyperlink

  818         /// </summary>

  819         private void AddHyperlinkTarget(HtmlTextWriter writer)

  820         {

  821             if (!string.IsNullOrEmpty(UrlPagingTarget))

  822                 writer.AddAttribute(HtmlTextWriterAttribute.Target, UrlPagingTarget);

  823         }

  824 

  825         /// <summary>

  826         /// add css class and style attribute to HtmlTextWriter

  827         /// </summary>

  828         private void AddClassAndStyle(string clsname, string style, HtmlTextWriter writer)

  829         {

  830             if (!string.IsNullOrEmpty(clsname))

  831                 writer.AddAttribute(HtmlTextWriterAttribute.Class, clsname);

  832             if (!string.IsNullOrEmpty(style))

  833                 writer.AddAttribute(HtmlTextWriterAttribute.Style, style);

  834         }

  835 

  836         #endregion

  837     }

  838 }