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(" ");
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 }
