DEVPAGE
1
//
AspNetPager分页控件源代码:
2 // 版权所有:陕西省吴旗县 Webdiyer([email protected])(Web site: www.webdiyer.com);
3 // 此源代码仅供学习参考,不得用作任何商业用途;
4 // 若需修改并重新编译该控件,请保留完整的源代码的版权信息!
5 // 有关控件升级及新控件发布信息,请留意 www.webdiyer.com 。
6 // 版本4.3.3
7 // 增强版 (修改自4.3.3版本)
8 // 描述:增加了可自定义每页的记录数。
9 // modify by liubiqu([email protected]) [ http://www.cnblogs.com/liubiqu ]
10 // DateTime: 2005-06-10
11
12 using System;
13 using System.Collections;
14 using System.Collections.Specialized;
15 using System.ComponentModel;
16 using System.IO;
17 using System.Text;
18 using System.Web.UI;
19 using System.Web.UI.Design.WebControls;
20 using System.Web.UI.WebControls;
21
22 namespace EOffice.Components
23 {
24 AspNetPager Server Control #region AspNetPager Server Control
25
26 控件说明及示例 #region 控件说明及示例
27 /**/ /// <summary>
28 /// 用于ASP.NET Web应用程序中对数据进行分页的的服务器控件。
29 /// </summary>
30 /// <remarks> 不同于DataGrid控件,AspNetPager分页控件本身并不显示任何数据,而只显示页导航元素,数据在页面上的显示方式与该控件无关。该控件可以为DataGrid、DataList、Repeater以及自定义控件进行分页,配合Sql存储过程,分页性能较使用DataGrid分页有明显提升,尤其是当数据量大时性能可提升数倍!
31 /// <p> AspNetPager 2.0 中新增了通过Url来分页的功能,这使得访问者可以直接输入相应的Url来访问任何页面,并且搜索引擎也可以直接检索每个页面,若使用DataGrid的分页功能,这是无法实现的。 </p>
32 /// <p> 要使用 AspNetPager 分页控件,必须最少指定它的 <see cref="RecordCount"/> 属性,指定并编写 <see cref="PageChanged"/> 事件的处理程序。
33 /// <see cref="RecordCount"/> 属性指定要分页的所有数据的总项数,若未指定该值或该值小于等于 <see cref="PageSize"/> ,则AspNetPager控件不会显示任何内容。
34 /// 若未指定并编写 <see cref="PageChanged"/> 事件处理程序,则当用户点击页导航元素或在页索引文本框中手式输入页索引并提交时AspNetPager不会跳转到指定的页。
35 /// AspNetPager控件的分页方法和DataGrid基本相同,即在它的 <see cref="PageChanged"/> 事件处理程序中将传递事件数据的 <see cref="PageChangedEventArgs"/> 的 <see cref="PageChangedEventArgs.NewPageIndex"/> 值赋给 AspNetPager的 <see cref="CurrentPageIndex"/> 属性,然后重新将新的数据与数据显示控件绑定。 </p></remarks>
36 /// <example> 以下示例说明如何用AspNetPager对DataGrid进行分页。
37 /// <code><![CDATA[
38 /// <%@ Page Language="C#"%>
39 /// <%@ Import Namespace="System.Data"%>
40 /// <%@Import Namespace="System.Data.SqlClient"%>
41 /// <%@Import Namespace="System.Configuration"%>
42 /// <%@Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager"%>
43 /// <HTML>
44 /// <HEAD>
45 /// <TITLE> Welcome to Webdiyer.com </TITLE>
46 /// <script runat="server">
47 /// SqlConnection conn;
48 /// SqlCommand cmd;
49 /// void Page_Load(object src,EventArgs e)
50 /// {
51 /// conn=new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"]);
52 /// if(!Page.IsPostBack)
53 /// {
54 /// cmd=new SqlCommand("GetNews",conn);
55 /// cmd.CommandType=CommandType.StoredProcedure;
56 /// cmd.Parameters.Add("@pageindex",1);
57 /// cmd.Parameters.Add("@pagesize",1);
58 /// cmd.Parameters.Add("@docount",true);
59 /// conn.Open();
60 /// pager.RecordCount=(int)cmd.ExecuteScalar();
61 /// conn.Close();
62 /// BindData();
63 /// }
64 /// }
65 ///
66 /// void BindData()
67 /// {
68 /// cmd=new SqlCommand("GetNews",conn);
69 /// cmd.CommandType=CommandType.StoredProcedure;
70 /// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
71 /// cmd.Parameters.Add("@pagesize",pager.PageSize);
72 /// cmd.Parameters.Add("@docount",false);
73 /// conn.Open();
74 /// dataGrid1.DataSource=cmd.ExecuteReader();
75 /// dataGrid1.DataBind();
76 /// conn.Close();
77 /// pager.CustomInfoText="记录总数: <font color=\"blue\"><b> "+pager.RecordCount.ToString()+" </b></font> ";
78 /// pager.CustomInfoText+=" 总页数: <font color=\"blue\"><b> "+pager.PageCount.ToString()+" </b></font> ";
79 /// pager.CustomInfoText+=" 当前页: <font color=\"red\"><b> "+pager.CurrentPageIndex.ToString()+" </b></font> ";
80 /// }
81 /// void ChangePage(object src,PageChangedEventArgs e)
82 /// {
83 /// pager.CurrentPageIndex=e.NewPageIndex;
84 /// BindData();
85 /// }
86 /// </script>
87 /// <meta http-equiv="Content-Language" content="zh-cn">
88 /// <meta http-equiv="content-type" content="text/html;charset=gb2312">
89 /// <META NAME="Generator" CONTENT="EditPlus">
90 /// <META NAME="Author" CONTENT="Webdiyer([email protected])">
91 /// </HEAD>
92 /// <body>
93 /// <form runat="server" ID="Form1">
94 /// <asp:DataGrid id="dataGrid1" runat="server" />
95 ///
96 /// <Webdiyer:AspNetPager id="pager"
97 /// runat="server"
98 /// PageSize="8"
99 /// NumericButtonCount="8"
100 /// ShowCustomInfoSection="left"
101 /// PagingButtonSpacing="0"
102 /// ShowInputBox="always"
103 /// CssClass="mypager"
104 /// HorizontalAlign="right"
105 /// OnPageChanged="ChangePage"
106 /// SubmitButtonText="转到"
107 /// NumericButtonTextFormatString="[{0}]"/>
108 ///
109 /// </form>
110 /// </body>
111 /// </HTML>
112 /// ]]>
113 /// </code>
114 /// <p> 下面是该示例所用的Sql Server存储过程: </p>
115 /// <code>
116 /// <![CDATA[
117 /// CREATE procedure GetNews
118 /// (@pagesize int,
119 /// @pageindex int,
120 /// @docount bit)
121 /// as
122 /// set nocount on
123 /// if(@docount=1)
124 /// select count(id) from news
125 /// else
126 /// begin
127 /// declare @indextable table(id int identity(1,1),nid int)
128 /// declare @PageLowerBound int
129 /// declare @PageUpperBound int
130 /// set @PageLowerBound=(@pageindex-1)*@pagesize
131 /// set @PageUpperBound=@PageLowerBound+@pagesize
132 /// set rowcount @PageUpperBound
133 /// insert into @indextable(nid) select id from news order by addtime desc
134 /// select O.id,O.source,O.title,O.addtime from news O,@indextable t where O.id=t.nid
135 /// and t.id>@PageLowerBound and t.id <=@PageUpperBound order by t.id
136 /// end
137 /// set nocount off
138 /// GO
139 /// ]]>
140 /// </code></example>
141 #endregion
142
143 [DefaultProperty( " PageSize " )]
144 [DefaultEvent( " PageChanged " )]
145 [ParseChildren( false )]
146 [PersistChildren( false )]
147 [Description( " 专用于ASP.Net Web应用程序的分页控件 " )]
148 [Designer( typeof (PagerDesigner))]
149 [ToolboxData( " <{0}:AspNetPager runat=server></{0}:AspNetPager> " )]
150 public class AspNetPager:Panel,INamingContainer,IPostBackEventHandler,IPostBackDataHandler
151 {
152 private string cssClassName;
153 private string urlPageIndexName = " page " ;
154 private string urlPageSize = " pagesize " ; // TODO:var urlPageSize add by liubiqu 2005-6-10
155 private bool urlPaging = false ;
156 private string inputPageIndex;
157 private string selectPageSize; // TODO:var selectPageSize add by liubiqu 2005-6-10
158 private string currentUrl = null ;
159 private NameValueCollection urlParams = null ;
160
161 Properties #region Properties
162
163 Navigation Buttons #region Navigation Buttons
164
165 /**/ /// <summary>
166 /// 获取或设置一个值,该值批示当鼠标指针悬停在导航按钮上时是否显示工具提示。
167 /// </summary>
168 [Browsable( true ),
169 Category( " 导航按钮 " ),
170 DefaultValue( true ),
171 Description( " 指定当鼠标停留在导航按钮上时,是否显示工具提示 " )]
172 public bool ShowNavigationToolTip
173 {
174 get
175 {
176 object obj = ViewState[ " ShowNavigationToolTip " ];
177 return (obj == null ) ? true :( bool )obj;
178 }
179 set
180 {
181 ViewState[ " ShowNavigationToolTip " ] = value;
182 }
183 }
184
185 /**/ /// <summary>
186 /// 获取或设置导航按钮工具提示文本的格式。
187 /// </summary>
188 [Browsable( true ),
189 Category( " 导航按钮 " ),
190 DefaultValue( " 转到第{0}页 " ),
191 Description( " 页导航按钮工具提示文本的格式 " )]
192 public string NavigationToolTipTextFormatString
193 {
194 get
195 {
196 object obj = ViewState[ " NavigationToolTipTextFormatString " ];
197 return (obj == null ) ? " 转到第{0}页 " :( string )obj;
198 }
199 set
200 {
201 string tip = value;
202 if (tip.Trim().Length < 1 && tip.IndexOf( " {0} " ) < 0 )
203 tip = " {0} " ;
204 ViewState[ " NavigationToolTipTextFormatString " ] = tip;
205 }
206 }
207
208 /**/ /// <summary>
209 /// 获取或设置一个值,该值指示是否将页索引按钮用中文数字代替。
210 /// </summary>
211 /// <remarks>
212 /// 将该值设为true并且未使用图片按钮时,页索引按钮中的数值1、2、3等将会被中文字符一、二、三等代替。
213 /// </remarks>
214 [Browsable( true ),
215 Category( " 导航按钮 " ),
216 DefaultValue( false ),
217 Description( " 是否将页索引数值按钮用中文数字一、二、三等代替 " )]
218 public bool ChinesePageIndex
219 {
220 get
221 {
222 object obj = ViewState[ " ChinesePageIndex " ];
223 return (obj == null ) ? false :( bool )obj;
224 }
225 set
226 {
227 ViewState[ " ChinesePageIndex " ] = value;
228 }
229 }
230
231 /**/ /// <summary>
232 /// 获取或设置页索引数值导航按钮上文字的显示格式。
233 /// </summary>
234 /// <value>
235 /// 字符串,指定页索引数值按钮上文字的显示格式,默认值为 <see cref="String.Empty"/> ,即未设置该属性。 </value>
236 /// <remarks>
237 /// 使用NumericButtonTextFormatString属性指定页索引数值按钮的显示格式,如未设置该值时索引按钮文本将会是:1 2 3 ,设置该值将改变索引按钮文本的显示格式,
238 /// 如将该值设为“[{0}]”则索引文本会显示为:[1] [2] [3] ,将该值设为“-{0}-”则会使索引文本变为:-1- -2- -3- 。
239 /// </remarks>
240 [Browsable( true ),
241 DefaultValue( "" ),
242 Category( " 导航按钮 " ),
243 Description( " 页索引数值按钮上文字的显示格式 " )]
244 public string NumericButtonTextFormatString
245 {
246 get
247 {
248 object obj = ViewState[ " NumericButtonTextFormatString " ];
249 return (obj == null ) ? String.Empty:( string )obj;
250 }
251 set
252 {
253 ViewState[ " NumericButtonTextFormatString " ] = value;
254 }
255 }
256
257 /**/ /// <summary>
258 /// 获取或设置分页导航按钮的类型,即使用文字还是图片。
259 /// </summary>
260 /// <remarks>
261 /// 要使用图片按钮,您需要准备以下图片:从0到9的十个数值图片(当ShowPageIndex设为true时),第一页、上一页、下一页、最后一页及更多页()五个按钮图片(当ShowFirstLast及ShowPrevNext都设为true时),
262 /// 若需要使当前页索引的数值按钮不同于别的页索引数值按钮,则还需准备当前页索引的按钮图片;
263 /// 若需要使已禁用的第一页、上一页、下一页及最后一页按钮图片不同于正常的按钮图片,则还需准备这四个按钮在禁用状态下的图片;
264 /// <p><b> 图片文件的命名规则如下: </b></p>
265 /// <p> 从0到9十张数值按钮图片必须命名为“数值+ButtonImageNameExtension+ButtonImageExtension”,其中的ButtonImageNameExtension可以不用设置,
266 /// ButtonImageExtension是图片文件的后缀名,如 .gif或 .jpg等可以在浏览器中显示的任何图片文件类型。如页索引“1”的图片文件可命名为“1.gif”或“1.jpg”,
267 /// 当您有两套或更多套图片文件时,可以通过指定ButtonImageNameExtension属性值来区分不同套的图片,如第一套图片可以不用设ButtonImageNameExtension,则图片文件名类似于“1.gif”、“2.gif”等等,而第二套图片则设置ButtonImageNameExtension为“f”,图片文件名类似于“1f.gif”,“2f.gif”等等。 </p>
268 /// <p> 第一页按钮的图片文件名以“first”开头,上一页按钮图片名以“prev”开头,下一页按钮图片名以“next”开头,最后一页按钮图片名以“last”开头,更多页按钮图片名以“more”开头,是否使用ButtonImageNameExtension取决于数值按钮的设置及是否有更多套图片。 </p>
269 /// </remarks>
270 /// <example>
271 /// 以下代码片段示例如果使用图片按钮:
272 /// <p>
273 /// <code><![CDATA[
274 /// <Webdiyer:AspNetPager runat="server"
275 /// id="pager1"
276 /// OnPageChanged="ChangePage"
277 /// PagingButtonType="image"
278 /// ImagePath="images"
279 /// ButtonImageNameExtension="n"
280 /// DisabledButtonImageNameExtension="g"
281 /// ButtonImageExtension="gif"
282 /// CpiButtonImageNameExtension="r"
283 /// PagingButtonSpacing=5/>
284 /// ]]>
285 /// </code>
286 /// </p>
287 /// </example>
288 [Browsable( true ),
289 DefaultValue(PagingButtonType.Text),
290 Category( " 导航按钮 " ),
291 Description( " 分页导航按钮的类型,是使用文字还是图片 " )]
292 public PagingButtonType PagingButtonType
293 {
294 get
295 {
296 object obj = ViewState[ " PagingButtonType " ];
297 return (obj == null ) ? PagingButtonType.Text:(PagingButtonType)obj;
298 }
299 set
300 {
301 ViewState[ " PagingButtonType " ] = value;
302 }
303 }
304
305 /**/ /// <summary>
306 /// 获取或设置页导航数值按钮的类型,该值仅当PagingButtonType设为Image时才有效。
307 /// </summary>
308 /// <remarks>
309 /// 当您将PagingButtonType设为Image当又不想让页索引数值按钮使用图片时,可以将该值设为Text,这会使页索引数据按钮使用文本而不是图片按钮。
310 /// </remarks>
311 [Browsable( true ),
312 DefaultValue(PagingButtonType.Text),
313 Category( " 导航按钮 " ),
314 Description( " 页导航数值按钮的类型 " )]
315 public PagingButtonType NumericButtonType
316 {
317 get
318 {
319 object obj = ViewState[ " NumericButtonType " ];
320 return (obj == null ) ? PagingButtonType:(PagingButtonType)obj;
321 }
322 set
323 {
324 ViewState[ " NumericButtonType " ] = value;
325 }
326 }
327
328 /**/ /// <summary>
329 /// 获取或设置第一页、上一页、下一页和最后一页按钮的类型,该值仅当PagingButtonType设为Image时才有效。
330 /// </summary>
331 /// <remarks>
332 /// 当您将PagingButtonType设为Image但又不想让第一页、下一页、下一页和最后一页按钮使用图片,则可以将该值设为Text,这会使前面的四个按钮使用文本而不是图片按钮。
333 /// </remarks>
334 [Browsable( true ),
335 Category( " 导航按钮 " ),
336 DefaultValue(PagingButtonType.Text),
337 Description( " 第一页、上一页、下一页和最后一页按钮的类型 " )]
338 public PagingButtonType NavigationButtonType
339 {
340 get
341 {
342 object obj = ViewState[ " NavigationButtonType " ];
343 return (obj == null ) ? PagingButtonType:(PagingButtonType)obj;
344 }
345 set
346 {
347 ViewState[ " NavigationButtonType " ] = value;
348 }
349 }
350
351 /**/ /// <summary>
352 /// 获取或设置“更多页”()按钮的类型,该值仅当PagingButtonType设为Image时才有效。
353 /// </summary>
354 /// <remarks>
355 /// 当您将PagingButtonType设为Image但又不想让更多页()按钮使用图片时,可以将此值设为Text,这会使更多页按钮使用文本而不是图片按钮。
356 /// </remarks>
357 [Browsable( true ),
358 Category( " 导航按钮 " ),
359 DefaultValue(PagingButtonType.Text),
360 Description( " “更多页”()按钮的类型 " )]
361 public PagingButtonType MoreButtonType
362 {
363 get
364 {
365 object obj = ViewState[ " MoreButtonType " ];
366 return (obj == null ) ? PagingButtonType:(PagingButtonType)obj;
367 }
368 set
369 {
370 ViewState[ " MoreButtonType " ] = value;
371 }
372 }
373
374 /**/ /// <summary>
375 /// 获取或设置分页导航按钮之间的间距。
376 /// </summary>
377 [Browsable( true ),
378 Category( " 导航按钮 " ),
379 DefaultValue( typeof (Unit), " 5px " ),
380 Description( " 分页导航按钮之间的间距 " )]
381 public Unit PagingButtonSpacing
382 {
383 get
384 {
385 object obj = ViewState[ " PagingButtonSpacing " ];
386 return (obj == null ) ? Unit.Pixel( 5 ):(Unit.Parse(obj.ToString()));
387 }
388 set
389 {
390 ViewState[ " PagingButtonSpacing " ] = value;
391 }
392 }
393
394 /**/ /// <summary>
395 /// 获取或设置一个值,该值指示是否在页导航元素中显示第一页和最后一页按钮。
396 /// </summary>
397 [Browsable( true ),
398 Description( " 是否在页导航元素中显示第一页和最后一页按钮 " ),
399 Category( " 导航按钮 " ),
400 DefaultValue( true )]
401 public bool ShowFirstLast
402 {
403 get
404 {
405 object obj = ViewState[ " ShowFirstLast " ];
406 return (obj == null ) ? true :( bool )obj;
407 }
408 set {ViewState[ " ShowFirstLast " ] = value;}
409 }
410
411 /**/ /// <summary>
412 /// 获取或设置一个值,该值指示是否在页导航元素中显示上一页和下一页按钮。
413 /// </summary>
414 [Browsable( true ),
415 Description( " 是否在页导航元素中显示上一页和下一页按钮 " ),
416 Category( " 导航按钮 " ),
417 DefaultValue( true )]
418 public bool ShowPrevNext
419 {
420 get
421 {
422 object obj = ViewState[ " ShowPrevNext " ];
423 return (obj == null ) ? true :( bool )obj;
424 }
425 set {ViewState[ " ShowPrevNext " ] = value;}
426 }
427
428 /**/ /// <summary>
429 /// 获取或设置一个值,该值指示是否在页导航元素中显示页索引数值按钮。
430 /// </summary>
431 [Browsable( true ),
432 Description( " 是否在页导航元素中显示数值按钮 " ),
433 Category( " 导航按钮 " ),
434 DefaultValue( true )]
435 public bool ShowPageIndex
436 {
437 get
438 {
439 object obj = ViewState[ " ShowPageIndex " ];
440 return (obj == null ) ? true :( bool )obj;
441 }
442 set {ViewState[ " ShowPageIndex " ] = value;}
443 }
444
445 /**/ /// <summary>
446 /// 获取或设置为第一页按钮显示的文本。
447 /// </summary>
448 [Browsable( true ),
449 Description( " 第一页按钮上显示的文本 " ),
450 Category( " 导航按钮 " ),
451 DefaultValue( " <font face=\ " webdings\ " >9</font> " )]
452 public string FirstPageText
453 {
454 get
455 {
456 object obj = ViewState[ " FirstPageText " ];
457 return (obj == null ) ? " <font face=\ " webdings\ " >9</font> " :( string )obj;
458 }
459 set {ViewState[ " FirstPageText " ] = value;}
460 }
461
462 /**/ /// <summary>
463 /// 获取或设置为上一页按钮显示的文本。
464 /// </summary>
465 [Browsable( true ),
466 Description( " 上一页按钮上显示的文本 " ),
467 Category( " 导航按钮 " ),
468 DefaultValue( " <font face=\ " webdings\ " >3</font> " )]
469 public string PrevPageText
470 {
471 get
472 {
473 object obj = ViewState[ " PrevPageText " ];
474 return (obj == null ) ? " <font face=\ " webdings\ " >3</font> " :( string )obj;
475 }
476 set {ViewState[ " PrevPageText " ] = value;}
477 }
478
479 /**/ /// <summary>
480 /// 获取或设置为下一页按钮显示的文本。
481 /// </summary>
482 [Browsable( true ),
483 Description( " 下一页按钮上显示的文本 " ),
484 Category( " 导航按钮 " ),
485 DefaultValue( " <font face=\ " webdings\ " >4</font> " )]
486 public string NextPageText
487 {
488 get
489 {
490 object obj = ViewState[ " NextPageText " ];
491 return (obj == null ) ? " <font face=\ " webdings\ " >4</font> " :( string )obj;
492 }
493 set {ViewState[ " NextPageText " ] = value;}
494 }
495
496 /**/ /// <summary>
497 /// 获取或设置为最后一页按钮显示的文本。
498 /// </summary>
499 [Browsable( true ),
500 Description( " 最后一页按钮上显示的文本 " ),
501 Category( " 导航按钮 " ),
502 DefaultValue( " <font face=\ " webdings\ " >:</font> " )]
503 public string LastPageText
504 {
505 get
506 {
507 object obj = ViewState[ " LastPageText " ];
508 return (obj == null ) ? " <font face=\ " webdings\ " >:</font> " :( string )obj;
509 }
510 set {ViewState[ " LastPageText " ] = value;}
511 }
512
513 /**/ /// <summary>
514 /// 获取或设置在 <see cref="AspNetPager"/> 控件的页导航元素中同时显示的数值按钮的数目。
515 /// </summary>
516 [Browsable( true ),
517 Description( " 要显示的页索引数值按钮的数目 " ),
518 Category( " 导航按钮 " ),
519 DefaultValue( 10 )]
520 public int NumericButtonCount
521 {
522 get
523 {
524 object obj = ViewState[ " NumericButtonCount " ];
525 return (obj == null ) ? 10 :( int )obj;
526 }
527 set {ViewState[ " NumericButtonCount " ] = value;}
528 }
529
530 /**/ /// <summary>
531 /// 获取或设置一个值,该值指定是否显示已禁用的按钮。
532 /// </summary>
533 /// <remarks>
534 /// 该值用来指定是否显示已禁用的分页导航按钮,当当前页为第一页时,第一页和上一页按钮将被禁用,当当前页为最后一页时,下一页和最后一页按钮将被禁用,被禁用的按钮没有链接,在按钮上点击也不会有任何作用。
535 /// </remarks>
536 [Browsable( true ),
537 Category( " 导航按钮 " ),
538 Description( " 是否显示已禁用的按钮 " ),
539 DefaultValue( true )]
540 public bool ShowDisabledButtons
541 {
542 get
543 {
544 object obj = ViewState[ " ShowDisabledButtons " ];
545 return (obj == null ) ? true :( bool )obj;
546 }
547 set
548 {
549 ViewState[ " ShowDisabledButtons " ] = value;
550 }
551 }
552
553 #endregion
554
555 Image Buttons #region Image Buttons
556
557 /**/ /// <summary>
558 /// 获取或设置当使用图片按钮时,图片文件的路径。
559 /// </summary>
560 [Browsable( true ),
561 Category( " 图片按钮 " ),
562 Description( " 当使用图片按钮时,指定图片文件的路径 " ),
563 DefaultValue( null )]
564 public string ImagePath
565 {
566 get
567 {
568 string imgPath = ( string )ViewState[ " ImagePath " ];
569 if (imgPath != null )
570 imgPath = this .ResolveUrl(imgPath);
571 return imgPath;
572 }
573 set
574 {
575 string imgPath = value.Trim().Replace( " \\ " , " / " );
576 ViewState[ " ImagePath " ] = (imgPath.EndsWith( " / " )) ? imgPath:imgPath + " / " ;
577 }
578 }
579
580 /**/ /// <summary>
581 /// 获取或设置当使用图片按钮时,图片的类型,如gif或jpg,该值即图片文件的后缀名。
582 /// </summary>
583 [Browsable( true ),
584 Category( " 图片按钮 " ),
585 DefaultValue( " .gif " ),
586 Description( " 当使用图片按钮时,图片的类型,如gif或jpg,该值即图片文件的后缀名 " )]
587 public string ButtonImageExtension
588 {
589 get
590 {
591 object obj = ViewState[ " ButtonImageExtension " ];
592 return (obj == null ) ? " .gif " :( string )obj;
593 }
594 set
595 {
596 string ext = value.Trim();
597 ViewState[ " ButtonImageExtension " ] = (ext.StartsWith( " . " )) ? ext:( " . " + ext);
598 }
599 }
600
601 /**/ /// <summary>
602 /// 获取或设置自定义图片文件名的后缀字符串,以区分不同类型的按钮图片。
603 /// </summary>
604 /// <remarks><note> 注意: </note> 该值不是文件后缀名,而是为区分不同的图片文件而在图片名中加入的字符串,如:
605 /// 当前有两套按钮图片,其中一套中的“1”的图片名可为“1f.gif”,另一套中的“1”的图片名可起为“1n.gif”,其中的f和n即为ButtonImageNameExtension。 </remarks>
606 [Browsable( true ),
607 DefaultValue( null ),
608 Category( " 图片按钮 " ),
609 Description( " 自定义图片文件名的后缀字符串(非文件后缀名),如图片“1f.gif”的ButtonImageNameExtension即为“f” " )]
610 public string ButtonImageNameExtension
611 {
612 get
613 {
614 return ( string )ViewState[ " ButtonImageNameExtension " ];
615 }
616 set
617 {
618 ViewState[ " ButtonImageNameExtension " ] = value;
619 }
620 }
621
622 /**/ /// <summary>
623 /// 获取或设置当前页索引按钮的图片名后缀。
624 /// </summary>
625 /// <remarks>
626 /// 当 <see cref="PagingButtonType"/> 设为 Image 时,该属性允许您设置当前页索引数值按钮使用的图片名后缀字符,因此可以使当前页索引按钮与其它页索引按钮使用不同的图片,若未设置该值,则默认值为 <see cref="ButtonImageNameExtension"/> ,即当前页索引按钮与其它页索引按钮使用相同的图片。
627 /// </remarks>
628 [Browsable( true ),
629 DefaultValue( null ),
630 Category( " 图片按钮 " ),
631 Description( " 当前页索引按钮的图片名后缀字符串 " )]
632 public string CpiButtonImageNameExtension
633 {
634 get
635 {
636 object obj = ViewState[ " CpiButtonImageNameExtension " ];
637 return (obj == null ) ? ButtonImageNameExtension:( string )obj;
638 }
639 set
640 {
641 ViewState[ " CpiButtonImageNameExtension " ] = value;
642 }
643 }
644
645 /**/ /// <summary>
646 /// 获取或设置已禁用的页导航按钮图片名后缀字符串。
647 /// </summary>
648 /// <remarks>
649 /// 当 <see cref="PagingButtonType"/> 设为 Image 时, 该值允许您设置已禁用(即没有链接,因而点击后无反应)的页导航按钮(包括第一页、上一页、下一页、最后一页四个按钮)的图片文件名后缀字符串,因此可以使已禁用的页导航按钮不同于正常的页导航按钮。若未设置该值,则默认值为 <see cref="ButtonImageNameExtension"/> ,即已禁用的页导航按钮与正常的页导航按钮使用相同的图片。
650 /// </remarks>
651 [Browsable( true ),
652 DefaultValue( null ),
653 Category( " 图片按钮 " ),
654 Description( " 已禁用的页导航按钮的图片名后缀字符串 " )]
655 public string DisabledButtonImageNameExtension
656 {
657 get
658 {
659 object obj = ViewState[ " DisabledButtonImageNameExtension " ];
660 return (obj == null ) ? ButtonImageNameExtension:( string )obj;
661 }
662 set
663 {
664 ViewState[ " DisabledButtonImageNameExtension " ] = value;
665 }
666 }
667 /**/ /// <summary>
668 /// 指定当使用图片按钮时,图片的对齐方式。
669 /// </summary>
670
671 [Browsable( true ),
672 Description( " 指定当使用图片按钮时,图片的对齐方式 " ),
673 DefaultValue(ImageAlign.Baseline),
674 Category( " 图片按钮 " )]
675 public ImageAlign ButtonImageAlign
676 {
677 get
678 {
679 object obj = ViewState[ " ButtonImageAlign " ];
680 return (obj == null ) ? ImageAlign.Baseline:(ImageAlign)obj;
681 }
682 set {ViewState[ " ButtonImageAlign " ] = value;}
683 }
684
685
686 #endregion
687
688 Paging #region Paging
689
690 /**/ /// <summary>
691 /// 获取或设置是否启用url来传递分页信息。
692 /// </summary>
693 /// <remarks>
694 /// 启用Url分页方式是将用户欲访问的页索引通过Url来传递,由于该分页方式不使用页面向自身回发来传递数据,
695 /// 所以每次分页时所有的数据都恢复为初始值或需要重新获取。使用Url分页方式不支持动态改变分页控件的属性值,
696 /// 因暂时无法将新的属性值通过Url来传递给下一页。
697 /// </remarks>
698 /// <example> 以下示例说明如何用AspNetPager的Url分页方式对DataGrid进行分页(使用Access数据库):
699 /// <code><![CDATA[
700 /// <%@Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager"%>
701 /// <%@Import Namespace="System.Data.OleDb"%>
702 /// <%@ Import Namespace="System.Data"%>
703 /// <%@ Page Language="C#" debug=true%>
704 /// <HTML>
705 /// <HEAD>
706 /// <TITLE> Welcome to Webdiyer.com </TITLE>
707 /// <script runat="server">
708 /// OleDbConnection conn;
709 /// OleDbCommand cmd;
710 /// void Page_Load(object src,EventArgs e){
711 /// conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("access/aspnetpager.mdb"));
712 /// if(!Page.IsPostBack){
713 /// cmd=new OleDbCommand("select count(newsid) from wqnews",conn);
714 /// conn.Open();
715 /// pager.RecordCount=(int)cmd.ExecuteScalar();
716 /// conn.Close();
717 /// BindData();
718 /// }
719 /// }
720 ///
721 /// void BindData(){
722 /// cmd=new OleDbCommand("select newsid,heading,source,addtime from wqnews order by addtime desc",conn);
723 /// OleDbDataAdapter adapter=new OleDbDataAdapter(cmd);
724 /// DataSet ds=new DataSet();
725 /// adapter.Fill(ds,pager.PageSize*(pager.CurrentPageIndex-1),pager.PageSize,"news");
726 /// dg.DataSource=ds.Tables["news"];
727 /// dg.DataBind();
728 /// }
729 ///
730 /// void ChangePage(object src,PageChangedEventArgs e){
731 /// pager.CurrentPageIndex=e.NewPageIndex;
732 /// BindData();
733 /// }
734 ///
735 /// </script>
736 /// <meta http-equiv="Content-Language" content="zh-cn">
737 /// <meta http-equiv="content-type" content="text/html;charset=gb2312">
738 /// <META NAME="Generator" CONTENT="EditPlus">
739 /// <META NAME="Author" CONTENT="Webdiyer([email protected])">
740 /// </HEAD>
741 /// <body>
742 /// <form runat="server" ID="Form1">
743 /// <h2 align="center"> AspNetPager分页示例 </h2>
744 /// <asp:DataGrid id="dg" runat="server"
745 /// Width="760" CellPadding="4" Align="center" />
746 ///
747 /// <Webdiyer:AspNetPager runat="server" id="pager"
748 /// OnPageChanged="ChangePage"
749 /// HorizontalAlign="center"
750 /// style="MARGIN-TOP:10px;FONT-SIZE:16px"
751 /// PageSize="8"
752 /// ShowInputBox="always"
753 /// SubmitButtonStyle="border:1px solid #000066;height:20px;width:30px"
754 /// InputBoxStyle="border:1px #0000FF solid;text-align:center"
755 /// SubmitButtonText="转到"
756 /// UrlPaging="true"
757 /// UrlPageIndexName="pageindex" />
758 /// </form>
759 /// </body>
760 /// </HTML>
761 /// ]]> </code>
762 /// </example>
763 [Browsable( true ),
764 Category( " 分页 " ),
765 DefaultValue( false ),
766 Description( " 是否使用url传递分页信息的方式来分页 " )]
767 public bool UrlPaging
768 {
769 get
770 {
771 return urlPaging;
772 }
773 set
774 {
775 urlPaging = value;
776 }
777 }
778
779 /**/ /// <summary>
780 /// 获取或设置当启用Url分页方式时,在url中表示要传递的页索引的参数的名称。
781 /// </summary>
782 /// <remarks>
783 /// 该属性允许您自定义通过Url传递页索引时表示要传递的页索引的参数的名称,以避免与现有的参数名重复。
784 /// <p> 该属性的默认值是“page”,即通过Url分页时,显示在浏览器地址栏中的Url类似于: </p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?page=2
785 /// <p> 如将该值改为“pageindex”,则上面的Url将变为: </p><p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pageindex=2 </p>
786 /// </remarks>
787 [Browsable( true ),
788 DefaultValue( " page " ),
789 Category( " 分页 " ),
790 Description( " 当启用Url分页方式时,显示在url中表示要传递的页索引的参数的名称 " )]
791 public string UrlPageIndexName
792 {
793 get { return urlPageIndexName;}
794 set {urlPageIndexName = value;}
795 }
796
797 /**/ /// <summary>
798 /// 获取或设置当启用Url分页方式时,在url中表示要传递的页索引的参数的名称。
799 /// </summary>
800 /// <remarks>
801 /// 该属性允许您自定义通过Url传递页索引时表示要传递的页索引的参数的名称,以避免与现有的参数名重复。
802 /// <p> 该属性的默认值是“page”,即通过Url分页时,显示在浏览器地址栏中的Url类似于: </p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pagesize=20
803 /// <p> 如将该值改为“pagesize1”,则上面的Url将变为: </p><p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pagesize1=20 </p>
804 /// </remarks>
805 [Browsable( true ),
806 DefaultValue( " pagesize " ),
807 Category( " 分页 " ),
808 Description( " 当启用Url分页方式时,显示在url中表示要传递的记录数的参数的名称 " )]
809 public string UrlPageSize
810 {
811 get { return urlPageSize;}
812 set {urlPageSize = value;}
813 }
814
815 /**/ /// <summary>
816 /// 获取或设置当前显示页的索引。
817 /// </summary>
818 /// <remarks> 使用此属性来确定在 AspNetPager 控件中当前显示的页,当前显示的页的数字索引将以红色字体加粗显示。此属性还用于以编程的方式控制所显示的页。
819 /// <p> <b> 注意: </b> 不同于DataGrid控件的CurrentPageIndex,AspNetPager的CurrentPageIndex属性是从1开始的。 </p></remarks>
820 [ReadOnly( true ),
821 Browsable( false ),
822 Description( " 当前显示页的索引 " ),
823 Category( " 分页 " ),
824 DefaultValue( 1 ),
825 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
826 public int CurrentPageIndex
827 {
828 get
829 {
830 object cpage = ViewState[ " CurrentPageIndex " ];
831 int pindex = (cpage == null ) ? 1 :( int )cpage;
832 if (pindex > PageCount && PageCount > 0 )
833 return PageCount;
834 else if (pindex < 1 )
835 return 1 ;
836 return pindex;
837 }
838 set
839 {
840 int cpage = value;
841 if (cpage < 1 )
842 cpage = 1 ;
843 else if (cpage > this .PageCount)
844 cpage = this .PageCount;
845 ViewState[ " CurrentPageIndex " ] = cpage;
846 }
847 }
848
849 /**/ /// <summary>
850 /// 获取或设置需要分页的所有记录的总数。
851 /// </summary>
852 /// <remarks>
853 /// 当页面第一次加载时,应以编程方式将从存储过程或Sql语句中返回的数据表中所有要分页的记录的总数赋予该属性,AspNetPager会将其保存的ViewState中并在页面回发时从ViewState中获取该值,因此避免了每次分页都要访问数据库而影响分页性能。AspNetPager根据要分页的所有数据的总项数和 <see cref="PageSize"/> 属性来计算显示所有数据需要的总页数,即 <see cref="PageCount"/> 的值。
854 /// </remarks>
855 /// <example>
856 /// 下面的示例显示如何以编程方式将从Sql语句返回的记录总数赋给该属性:
857 /// <p>
858 /// <code><![CDATA[
859 /// <HTML>
860 /// <HEAD>
861 /// <TITLE> Welcome to Webdiyer.com </TITLE>
862 /// <script runat="server">
863 /// SqlConnection conn;
864 /// SqlCommand cmd;
865 /// void Page_Load(object src,EventArgs e)
866 /// {
867 /// conn=new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"]);
868 /// if(!Page.IsPostBack)
869 /// {
870 /// cmd=new SqlCommand("select count(id) from news",conn);
871 /// conn.Open();
872 /// pager.RecordCount=(int)cmd.ExecuteScalar();
873 /// conn.Close();
874 /// BindData();
875 /// }
876 /// }
877 ///
878 /// void BindData()
879 /// {
880 /// cmd=new SqlCommand("GetPagedNews",conn);
881 /// cmd.CommandType=CommandType.StoredProcedure;
882 /// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
883 /// cmd.Parameters.Add("@pagesize",pager.PageSize);
884 /// conn.Open();
885 /// dataGrid1.DataSource=cmd.ExecuteReader();
886 /// dataGrid1.DataBind();
887 /// conn.Close();
888 /// }
889 /// void ChangePage(object src,PageChangedEventArgs e)
890 /// {
891 /// pager.CurrentPageIndex=e.NewPageIndex;
892 /// BindData();
893 /// }
894 /// </script>
895 /// <meta http-equiv="Content-Language" content="zh-cn">
896 /// <meta http-equiv="content-type" content="text/html;charset=gb2312">
897 /// <META NAME="Generator" CONTENT="EditPlus">
898 /// <META NAME="Author" CONTENT="Webdiyer([email protected])">
899 /// </HEAD>
900 /// <body>
901 /// <form runat="server" ID="Form1">
902 /// <asp:DataGrid id="dataGrid1" runat="server" />
903 ///
904 /// <Webdiyer:AspNetPager id="pager" runat="server"
905 /// PageSize="8"
906 /// NumericButtonCount="8"
907 /// ShowCustomInfoSection="before"
908 /// ShowInputBox="always"
909 /// CssClass="mypager"
910 /// HorizontalAlign="center"
911 /// OnPageChanged="ChangePage" />
912 ///
913 /// </form>
914 /// </body>
915 /// </HTML>
916 /// ]]>
917 /// </code></p>
918 /// <p> 本示例使用的存储过程代码如下: </p>
919 /// <code><![CDATA[
920 /// CREATE procedure GetPagedNews
921 /// (@pagesize int,
922 /// @pageindex int)
923 /// as
924 /// set nocount on
925 /// declare @indextable table(id int identity(1,1),nid int)
926 /// declare @PageLowerBound int
927 /// declare @PageUpperBound int
928 /// set @PageLowerBound=(@pageindex-1)*@pagesize
929 /// set @PageUpperBound=@PageLowerBound+@pagesize
930 /// set rowcount @PageUpperBound
931 /// insert into @indextable(nid) select id from news order by addtime desc
932 /// select O.id,O.title,O.source,O.addtime from news O,@indextable t where O.id=t.nid
933 /// and t.id>@PageLowerBound and t.id <=@PageUpperBound order by t.id
934 /// set nocount off
935 /// GO
936 /// ]]>
937 /// </code>
938 /// </example>
939 [Browsable( false ),
940 Description( " 要分页的所有记录的总数,该值须在程序运行时设置,默认值为225是为设计时支持而设置的参照值。 " ),
941 Category( " Data " ),
942 DefaultValue( 225 )]
943 public int RecordCount
944 {
945 get
946 {
947 object obj = ViewState[ " Recordcount " ];
948 return (obj == null ) ? 0 :( int )obj;
949 }
950 set {ViewState[ " Recordcount " ] = value;}
951 }
952
953 /**/ /// <summary>
954 /// 获取当前页之后未显示的页的总数。
955 /// </summary>
956 [Browsable( false ),
957 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
958 public int PagesRemain
959 {
960 get
961 {
962 return PageCount - CurrentPageIndex;
963 }
964 }
965
966 /**/ /// <summary>
967 /// 获取或设置每页显示的项数。
968 /// </summary>
969 /// <remarks>
970 /// 该值获取或设置数据呈现控件每次要显示数据表中的的数据的项数,AspNetPager根据该值和 <see cref="RecordCount"/> 来计算显示所有数据需要的总页数,即 <see cref="PageCount"/> 的值。 </remarks>
971 /// <example> 以下示例将 <see cref="AspNetPager"/> 设置为允许每页显示8条数据:
972 /// <code>
973 /// <![CDATA[
974 ///
975 /// <Webdiyer:AspNetPager id="pager" runat="server" PageSize=8 OnPageChanged="ChangePage"/>
976 ///
977 /// ]]> </code></example>
978 [Browsable( true ),
979 Description( " 每页显示的记录数 " ),
980 Category( " 分页 " ),
981 DefaultValue( 10 )]
982 public int PageSize
983 {
984 get
985 {
986 object obj = ViewState[ " PageSize " ];
987 return (obj == null ) ? 10 :( int )obj;
988 }
989 set
990 {
991 ViewState[ " PageSize " ] = value;
992 }
993 }
994
995 /**/ /// <summary>
996 /// 获取在当前页之后还未显示的剩余记录的项数。
997 /// </summary>
998 [Browsable( false ),
999 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1000 public int RecordsRemain
1001 {
1002 get
1003 {
1004 if (CurrentPageIndex < PageCount)
1005 return RecordCount - (CurrentPageIndex * PageSize);
1006 return 0 ;}
1007 }
1008
1009
1010 /**/ /// <summary>
1011 /// 获取所有要分页的记录需要的总页数。
1012 /// </summary>
1013 [Browsable( false ),
1014 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1015 public int PageCount
1016 {
1017 get { return ( int )Math.Ceiling(( double )RecordCount / ( double )PageSize);}
1018 }
1019
1020
1021 #endregion
1022
1023 TextBox and Submit Button #region TextBox and Submit Button
1024
1025 /**/ /// <summary>
1026 /// 获取或设置页索引文本框的显示方式。
1027 /// </summary>
1028 /// <remarks>
1029 /// 页索引文件框允许用户手式输入要访问的页的索引,当页数非常多时,显示页索引文本框非常方便用户跳转到指定的页,默认情况下,该文本框只有在总页数大于或等于 <see cref="ShowBoxThreshold"/> 的值时才显示,否则不显示,要想该文本框任何时候都显示,请将其值设为Always,若希望任何时候都不显示,则应设为Never。
1030 /// </remarks>
1031 [Browsable( true ),
1032 Description( " 指定页索引文本框的显示方式 " ),
1033 Category( " 文本框及提交按钮 " ),
1034 DefaultValue(ShowInputBox.Auto)]
1035 public ShowInputBox ShowInputBox
1036 {
1037 get
1038 {
1039 object obj = ViewState[ " ShowInputBox " ];
1040 return (obj == null ) ? ShowInputBox.Auto:(ShowInputBox)obj;
1041 }
1042 set {ViewState[ " ShowInputBox " ] = value;}
1043 }
1044
1045 /**/ /// <summary>
1046 /// 获取或设置应用于页索引输入文本框的CSS类名。
1047 /// </summary>
1048 [Browsable( true ),
1049 Category( " 文本框及提交按钮 " ),
1050 DefaultValue( null ),
1051 Description( " 应用于页索引输入文本框的CSS类名 " )]
1052 public string InputBoxClass
1053 {
1054 get
1055 {
1056 return ( string )ViewState[ " InputBoxClass " ];
1057 }
1058 set
1059 {
1060 if (value.Trim().Length > 0 )
1061 ViewState[ " InputBoxClass " ] = value;
1062 }
1063 }
1064
1065 /**/ /// <summary>
1066 /// 获取或设置页索引输入文本框的CSS样式文本。
1067 /// </summary>
1068
1069 [Browsable( true ),
1070 Category( " 文本框及提交按钮 " ),
1071 DefaultValue( null ),
1072 Description( " 应用于页索引输入文本框的CSS样式文本 " )]
1073 public string InputBoxStyle
1074 {
1075 get
1076 {
1077 return ( string )ViewState[ " InputBoxStyle " ];
1078 }
1079 set
1080 {
1081 if (value.Trim().Length > 0 )
1082 ViewState[ " InputBoxStyle " ] = value;
1083 }
1084 }
1085
1086 /**/ /// <summary>
1087 /// 获取或设置页索引页索引输入文本框前的文本字符串值。
1088 /// </summary>
1089 [Browsable( true ),
1090 Category( " 文本框及提交按钮 " ),
1091 DefaultValue( null ),
1092 Description( " 页索引输入文本框前的文本内容字符串 " )]
1093 public string TextBeforeInputBox
1094 {
1095 get
1096 {
1097 return ( string )ViewState[ " TextBeforeInputBox " ];
1098 }
1099 set
1100 {
1101 ViewState[ " TextBeforeInputBox " ] = value;
1102 }
1103 }
1104
1105 /**/ /// <summary>
1106 /// 获取或设置页索引文本输入框后的文本内容字符串值。
1107 /// </summary>
1108 [Browsable( true ),
1109 DefaultValue( null ),
1110 Category( " 文本框及提交按钮 " ),
1111 Description( " 页索引输入文本框后的文本内容字符串 " )]
1112 public string TextAfterInputBox
1113 {
1114 get
1115 {
1116 return ( string )ViewState[ " TextAfterInputBox " ];
1117 }
1118 set
1119 {
1120 ViewState[ " TextAfterInputBox " ] = value;
1121 }
1122 }
1123
1124
1125 /**/ /// <summary>
1126 /// 获取或设置提交按钮上的文本。
1127 /// </summary>
1128 [Browsable( true ),
1129 Category( " 文本框及提交按钮 " ),
1130 DefaultValue( " go " ),
1131 Description( " 提交按钮上的文本 " )]
1132 public string SubmitButtonText
1133 {
1134 get
1135 {
1136 object obj = ViewState[ " SubmitButtonText " ];
1137 return (obj == null ) ? " go " :( string )obj;
1138 }
1139 set
1140 {
1141 if (value.Trim().Length > 0 )
1142 ViewState[ " SubmitButtonText " ] = value;
1143 }
1144 }
1145 /**/ /// <summary>
1146 /// 获取或设置应用于提交按钮的CSS类名。
1147 /// </summary>
1148 [Browsable( true ),
1149 Category( " 文本框及提交按钮 " ),
1150 DefaultValue( null ),
1151 Description( " 应用于提交按钮的CSS类名 " )]
1152 public string SubmitButtonClass
1153 {
1154 get
1155 {
1156 return ( string )ViewState[ " SubmitButtonClass " ];
1157 }
1158 set
1159 {
1160 ViewState[ " SubmitButtonClass " ] = value;
1161 }
1162 }
1163
1164 /**/ /// <summary>
1165 /// 获取或设置应用于提交按钮的CSS样式。
1166 /// </summary>
1167 [Browsable( true ),
1168 Category( " 文本框及提交按钮 " ),
1169 DefaultValue( null ),
1170 Description( " 应用于提交按钮的CSS样式 " )]
1171 public string SubmitButtonStyle
1172 {
1173 get
1174 {
1175 return ( string )ViewState[ " SubmitButtonStyle " ];
1176 }
1177 set
1178 {
1179 ViewState[ " SubmitButtonStyle " ] = value;
1180 }
1181 }
1182 /**/ /// <summary>
1183 /// 获取或设置自动显示页索引输入文本框的最低起始页数。
1184 /// </summary>
1185 /// <remarks>
1186 /// 当 <see cref="ShowInputBox"/> 设为Auto(默认)并且要分页的数据的总页数达到该值时会自动显示页索引输入文本框,默认值为30。该选项当 <see cref="ShowInputBox"/> 设为Never或Always时没有任何作用。
1187 /// </remarks>
1188 [Browsable( true ),
1189 Description( " 指定当ShowInputBox设为ShowInputBox.Auto时,当总页数达到多少时才显示页索引输入文本框 " ),
1190 Category( " 文本框及提交按钮 " ),
1191 DefaultValue( 30 )]
1192 public int ShowBoxThreshold
1193 {
1194 get
1195 {
1196 object obj = ViewState[ " ShowBoxThreshold " ];
1197 return (obj == null ) ? 30 :( int )obj;
1198 }
1199 set {ViewState[ " ShowBoxThreshold " ] = value;}
1200 }
1201
1202
1203 #endregion
1204
1205 SelectBox and Submit Button #region SelectBox and Submit Button
1206
1207 /**/ /// <summary>
1208 /// 获取或设置页索引文本框的显示方式。
1209 /// </summary>
1210 /// <remarks>
1211 /// 页索引文件框允许用户手式输入要访问的页的索引,当页数非常多时,显示页索引文本框非常方便用户跳转到指定的页,默认情况下,该文本框只有在总页数大于或等于 <see cref="ShowBoxThreshold"/> 的值时才显示,否则不显示,要想该文本框任何时候都显示,请将其值设为Always,若希望任何时候都不显示,则应设为Never。
1212 /// </remarks>
1213 [Browsable( true ),
1214 Description( " 指定页索引文本框的显示方式 " ),
1215 Category( " 分页记录数选择 " ),
1216 DefaultValue(ShowInputBox.Auto)]
1217 public ShowInputBox ShowSelectBox
1218 {
1219 get
1220 {
1221 object obj = ViewState[ " ShowSelectBox " ];
1222 return (obj == null ) ? ShowInputBox.Auto:(ShowInputBox)obj;
1223 }
1224 set {ViewState[ " ShowSelectBox " ] = value;}
1225 }
1226
1227 /**/ /// <summary>
1228 /// 获取或设置应用于页索引输入文本框的CSS类名。
1229 /// </summary>
1230 [Browsable( true ),
1231 Category( " 分页记录数选择 " ),
1232 DefaultValue( null ),
1233 Description( " 应用于页索引输入文本框的CSS类名 " )]
1234 public string SelectBoxClass
1235 {
1236 get
1237 {
1238 return ( string )ViewState[ " SelectBoxClass " ];
1239 }
1240 set
1241 {
1242 if (value.Trim().Length > 0 )
1243 ViewState[ " SelectBoxClass " ] = value;
1244 }
1245 }
1246
1247 /**/ /// <summary>
1248 /// 获取或设置页索引输入文本框的CSS样式文本。
1249 /// </summary>
1250
1251 [Browsable( true ),
1252 Category( " 分页记录数选择 " ),
1253 DefaultValue( null ),
1254 Description( " 应用于页索引输入文本框的CSS样式文本 " )]
1255 public string SelectBoxStyle
1256 {
1257 get
1258 {
1259 return ( string )ViewState[ " SelectBoxStyle " ];
1260 }
1261 set
1262 {
1263 if (value.Trim().Length > 0 )
1264 ViewState[ " SelectBoxStyle " ] = value;
1265 }
1266 }
1267
1268 /**/ /// <summary>
1269 /// 获取或设置页索引页索引输入文本框前的文本字符串值。
1270 /// </summary>
1271 [Browsable( true ),
1272 Category( " 分页记录数选择 " ),
1273 DefaultValue( " 每页 " ),
1274 Description( " 页索引输入文本框前的文本内容字符串 " )]
1275 public string TextBeforeSelectBox
1276 {
1277 get
1278 {
1279 return ( string )ViewState[ " TextBeforeSelectBox " ];
1280 }
1281 set
1282 {
1283 ViewState[ " TextBeforeSelectBox " ] = value;
1284 }
1285 }
1286
1287 /**/ /// <summary>
1288 /// 获取或设置页索引文本输入框后的文本内容字符串值。
1289 /// </summary>
1290 [Browsable( true ),
1291 DefaultValue( " 条 " ),
1292 Category( " 分页记录数选择 " ),
1293 Description( " 页索引输入文本框后的文本内容字符串 " )]
1294 public string TextAfterSelectBox
1295 {
1296 get
1297 {
1298 return ( string )ViewState[ " TextAfterSelectBox " ];
1299 }
1300 set
1301 {
1302 ViewState[ " TextAfterSelectBox " ] = value;
1303 }
1304 }
1305
1306
1307 /**/ /// <summary>
1308 /// 获取或设置提交按钮上的文本。
1309 /// </summary>
1310 [Browsable( true ),
1311 Category( " 分页记录数选择 " ),
1312 DefaultValue( " 设置 " ),
1313 Description( " 提交按钮上的文本 " )]
1314 public string SubmitButtonSelectText
1315 {
1316 get
1317 {
1318 object obj = ViewState[ " SubmitButtonSelectText " ];
1319 return (obj == null ) ? " 设置 " :( string )obj;
1320 }
1321 set
1322 {
1323 if (value.Trim().Length > 0 )
1324 ViewState[ " SubmitButtonSelectText " ] = value;
1325 }
1326 }
1327 /**/ /// <summary>
1328 /// 获取或设置自动显示页索引输入文本框的最低起始页数。
1329 /// </summary>
1330 /// <remarks>
1331 /// 当 <see cref="ShowInputBox"/> 设为Auto(默认)并且要分页的数据的总页数达到该值时会自动显示页索引输入文本框,默认值为30。该选项当 <see cref="ShowInputBox"/> 设为Never或Always时没有任何作用。
1332 /// </remarks>
1333 [Browsable( true ),
1334 Description( " 指定当ShowInputBox设为ShowInputBox.Auto时,当总页数达到多少时才显示页索引输入文本框 " ),
1335 Category( " 分页记录数选择 " ),
1336 DefaultValue( 30 )]
1337 public int ShowSelectBoxThreshold
1338 {
1339 get
1340 {
1341 object obj = ViewState[ " ShowSelectBoxThreshold " ];
1342 return (obj == null ) ? 30 :( int )obj;
1343 }
1344 set {ViewState[ " ShowSelectBoxThreshold " ] = value;}
1345 }
1346
1347
1348 #endregion
1349
1350 CustomInfoSection #region CustomInfoSection
1351
1352 /**/ /// <summary>
1353 /// 获取或设置显示用户自定义信息区的方式。
1354 /// </summary>
1355 /// <remarks>
1356 /// 该属性值设为Left或Right时会在分页导航元素左边或右边划出一个专门的区域来显示有关用户自定义信息,设为Never时不显示。
1357 /// </remarks>
1358 [Browsable( true ),
1359 Description( " 显示当前页和总页数信息,默认值为不显示,值为ShowCustomInfoSection.Left时将显示在页索引前,为ShowCustomInfoSection.Right时将显示在页索引后 " ),
1360 DefaultValue(ShowCustomInfoSection.Never),
1361 Category( " 自定义信息区 " )]
1362 public ShowCustomInfoSection ShowCustomInfoSection
1363 {
1364 get
1365 {
1366 object obj = ViewState[ " ShowCustomInfoSection " ];
1367 return (obj == null ) ? ShowCustomInfoSection.Never:(ShowCustomInfoSection)obj;
1368 }
1369 set {ViewState[ " ShowCustomInfoSection " ] = value;}
1370 }
1371
1372 /**/ /// <summary>
1373 /// 获取或设置用户自定义信息区文本的对齐方式。
1374 /// </summary>
1375 [Browsable( true ),
1376 Category( " 自定义信息区 " ),
1377 DefaultValue(HorizontalAlign.Left),
1378 Description( " 用户自定义信息区文本的对齐方式 " )]
1379 public HorizontalAlign CustomInfoTextAlign
1380 {
1381 get
1382 {
1383 object obj = ViewState[ " CustomInfoTextAlign " ];
1384 return (obj == null ) ? HorizontalAlign.Left:(HorizontalAlign)obj;
1385 }
1386 set
1387 {
1388 ViewState[ " CustomInfoTextAlign " ] = value;
1389 }
1390 }
1391
1392 /**/ /// <summary>
1393 /// 获取或设置用户自定义信息区的宽度。
1394 /// </summary>
1395 [Browsable( true ),
1396 Category( " 自定义信息区 " ),
1397 DefaultValue( typeof (Unit), " 40% " ),
1398 Description( " 用户自定义信息区的宽度 " )]
1399 public Unit CustomInfoSectionWidth
1400 {
1401 get
1402 {
1403 object obj = ViewState[ " CustomInfoSectionWidth " ];
1404 return (obj == null ) ? Unit.Percentage( 40 ):(Unit)obj;
1405 }
1406 set
1407 {
1408 ViewState[ " CustomInfoSectionWidth " ] = value;
1409 }
1410 }
1411
1523 [Browsable( false ),
2601
2608 /// 使用文字按钮。
2 // 版权所有:陕西省吴旗县 Webdiyer([email protected])(Web site: www.webdiyer.com);
3 // 此源代码仅供学习参考,不得用作任何商业用途;
4 // 若需修改并重新编译该控件,请保留完整的源代码的版权信息!
5 // 有关控件升级及新控件发布信息,请留意 www.webdiyer.com 。
6 // 版本4.3.3
7 // 增强版 (修改自4.3.3版本)
8 // 描述:增加了可自定义每页的记录数。
9 // modify by liubiqu([email protected]) [ http://www.cnblogs.com/liubiqu ]
10 // DateTime: 2005-06-10
11
12 using System;
13 using System.Collections;
14 using System.Collections.Specialized;
15 using System.ComponentModel;
16 using System.IO;
17 using System.Text;
18 using System.Web.UI;
19 using System.Web.UI.Design.WebControls;
20 using System.Web.UI.WebControls;
21
22 namespace EOffice.Components
23 {
24 AspNetPager Server Control #region AspNetPager Server Control
25
26 控件说明及示例 #region 控件说明及示例
27 /**/ /// <summary>
28 /// 用于ASP.NET Web应用程序中对数据进行分页的的服务器控件。
29 /// </summary>
30 /// <remarks> 不同于DataGrid控件,AspNetPager分页控件本身并不显示任何数据,而只显示页导航元素,数据在页面上的显示方式与该控件无关。该控件可以为DataGrid、DataList、Repeater以及自定义控件进行分页,配合Sql存储过程,分页性能较使用DataGrid分页有明显提升,尤其是当数据量大时性能可提升数倍!
31 /// <p> AspNetPager 2.0 中新增了通过Url来分页的功能,这使得访问者可以直接输入相应的Url来访问任何页面,并且搜索引擎也可以直接检索每个页面,若使用DataGrid的分页功能,这是无法实现的。 </p>
32 /// <p> 要使用 AspNetPager 分页控件,必须最少指定它的 <see cref="RecordCount"/> 属性,指定并编写 <see cref="PageChanged"/> 事件的处理程序。
33 /// <see cref="RecordCount"/> 属性指定要分页的所有数据的总项数,若未指定该值或该值小于等于 <see cref="PageSize"/> ,则AspNetPager控件不会显示任何内容。
34 /// 若未指定并编写 <see cref="PageChanged"/> 事件处理程序,则当用户点击页导航元素或在页索引文本框中手式输入页索引并提交时AspNetPager不会跳转到指定的页。
35 /// AspNetPager控件的分页方法和DataGrid基本相同,即在它的 <see cref="PageChanged"/> 事件处理程序中将传递事件数据的 <see cref="PageChangedEventArgs"/> 的 <see cref="PageChangedEventArgs.NewPageIndex"/> 值赋给 AspNetPager的 <see cref="CurrentPageIndex"/> 属性,然后重新将新的数据与数据显示控件绑定。 </p></remarks>
36 /// <example> 以下示例说明如何用AspNetPager对DataGrid进行分页。
37 /// <code><![CDATA[
38 /// <%@ Page Language="C#"%>
39 /// <%@ Import Namespace="System.Data"%>
40 /// <%@Import Namespace="System.Data.SqlClient"%>
41 /// <%@Import Namespace="System.Configuration"%>
42 /// <%@Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager"%>
43 /// <HTML>
44 /// <HEAD>
45 /// <TITLE> Welcome to Webdiyer.com </TITLE>
46 /// <script runat="server">
47 /// SqlConnection conn;
48 /// SqlCommand cmd;
49 /// void Page_Load(object src,EventArgs e)
50 /// {
51 /// conn=new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"]);
52 /// if(!Page.IsPostBack)
53 /// {
54 /// cmd=new SqlCommand("GetNews",conn);
55 /// cmd.CommandType=CommandType.StoredProcedure;
56 /// cmd.Parameters.Add("@pageindex",1);
57 /// cmd.Parameters.Add("@pagesize",1);
58 /// cmd.Parameters.Add("@docount",true);
59 /// conn.Open();
60 /// pager.RecordCount=(int)cmd.ExecuteScalar();
61 /// conn.Close();
62 /// BindData();
63 /// }
64 /// }
65 ///
66 /// void BindData()
67 /// {
68 /// cmd=new SqlCommand("GetNews",conn);
69 /// cmd.CommandType=CommandType.StoredProcedure;
70 /// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
71 /// cmd.Parameters.Add("@pagesize",pager.PageSize);
72 /// cmd.Parameters.Add("@docount",false);
73 /// conn.Open();
74 /// dataGrid1.DataSource=cmd.ExecuteReader();
75 /// dataGrid1.DataBind();
76 /// conn.Close();
77 /// pager.CustomInfoText="记录总数: <font color=\"blue\"><b> "+pager.RecordCount.ToString()+" </b></font> ";
78 /// pager.CustomInfoText+=" 总页数: <font color=\"blue\"><b> "+pager.PageCount.ToString()+" </b></font> ";
79 /// pager.CustomInfoText+=" 当前页: <font color=\"red\"><b> "+pager.CurrentPageIndex.ToString()+" </b></font> ";
80 /// }
81 /// void ChangePage(object src,PageChangedEventArgs e)
82 /// {
83 /// pager.CurrentPageIndex=e.NewPageIndex;
84 /// BindData();
85 /// }
86 /// </script>
87 /// <meta http-equiv="Content-Language" content="zh-cn">
88 /// <meta http-equiv="content-type" content="text/html;charset=gb2312">
89 /// <META NAME="Generator" CONTENT="EditPlus">
90 /// <META NAME="Author" CONTENT="Webdiyer([email protected])">
91 /// </HEAD>
92 /// <body>
93 /// <form runat="server" ID="Form1">
94 /// <asp:DataGrid id="dataGrid1" runat="server" />
95 ///
96 /// <Webdiyer:AspNetPager id="pager"
97 /// runat="server"
98 /// PageSize="8"
99 /// NumericButtonCount="8"
100 /// ShowCustomInfoSection="left"
101 /// PagingButtonSpacing="0"
102 /// ShowInputBox="always"
103 /// CssClass="mypager"
104 /// HorizontalAlign="right"
105 /// OnPageChanged="ChangePage"
106 /// SubmitButtonText="转到"
107 /// NumericButtonTextFormatString="[{0}]"/>
108 ///
109 /// </form>
110 /// </body>
111 /// </HTML>
112 /// ]]>
113 /// </code>
114 /// <p> 下面是该示例所用的Sql Server存储过程: </p>
115 /// <code>
116 /// <![CDATA[
117 /// CREATE procedure GetNews
118 /// (@pagesize int,
119 /// @pageindex int,
120 /// @docount bit)
121 /// as
122 /// set nocount on
123 /// if(@docount=1)
124 /// select count(id) from news
125 /// else
126 /// begin
127 /// declare @indextable table(id int identity(1,1),nid int)
128 /// declare @PageLowerBound int
129 /// declare @PageUpperBound int
130 /// set @PageLowerBound=(@pageindex-1)*@pagesize
131 /// set @PageUpperBound=@PageLowerBound+@pagesize
132 /// set rowcount @PageUpperBound
133 /// insert into @indextable(nid) select id from news order by addtime desc
134 /// select O.id,O.source,O.title,O.addtime from news O,@indextable t where O.id=t.nid
135 /// and t.id>@PageLowerBound and t.id <=@PageUpperBound order by t.id
136 /// end
137 /// set nocount off
138 /// GO
139 /// ]]>
140 /// </code></example>
141 #endregion
142
143 [DefaultProperty( " PageSize " )]
144 [DefaultEvent( " PageChanged " )]
145 [ParseChildren( false )]
146 [PersistChildren( false )]
147 [Description( " 专用于ASP.Net Web应用程序的分页控件 " )]
148 [Designer( typeof (PagerDesigner))]
149 [ToolboxData( " <{0}:AspNetPager runat=server></{0}:AspNetPager> " )]
150 public class AspNetPager:Panel,INamingContainer,IPostBackEventHandler,IPostBackDataHandler
151 {
152 private string cssClassName;
153 private string urlPageIndexName = " page " ;
154 private string urlPageSize = " pagesize " ; // TODO:var urlPageSize add by liubiqu 2005-6-10
155 private bool urlPaging = false ;
156 private string inputPageIndex;
157 private string selectPageSize; // TODO:var selectPageSize add by liubiqu 2005-6-10
158 private string currentUrl = null ;
159 private NameValueCollection urlParams = null ;
160
161 Properties #region Properties
162
163 Navigation Buttons #region Navigation Buttons
164
165 /**/ /// <summary>
166 /// 获取或设置一个值,该值批示当鼠标指针悬停在导航按钮上时是否显示工具提示。
167 /// </summary>
168 [Browsable( true ),
169 Category( " 导航按钮 " ),
170 DefaultValue( true ),
171 Description( " 指定当鼠标停留在导航按钮上时,是否显示工具提示 " )]
172 public bool ShowNavigationToolTip
173 {
174 get
175 {
176 object obj = ViewState[ " ShowNavigationToolTip " ];
177 return (obj == null ) ? true :( bool )obj;
178 }
179 set
180 {
181 ViewState[ " ShowNavigationToolTip " ] = value;
182 }
183 }
184
185 /**/ /// <summary>
186 /// 获取或设置导航按钮工具提示文本的格式。
187 /// </summary>
188 [Browsable( true ),
189 Category( " 导航按钮 " ),
190 DefaultValue( " 转到第{0}页 " ),
191 Description( " 页导航按钮工具提示文本的格式 " )]
192 public string NavigationToolTipTextFormatString
193 {
194 get
195 {
196 object obj = ViewState[ " NavigationToolTipTextFormatString " ];
197 return (obj == null ) ? " 转到第{0}页 " :( string )obj;
198 }
199 set
200 {
201 string tip = value;
202 if (tip.Trim().Length < 1 && tip.IndexOf( " {0} " ) < 0 )
203 tip = " {0} " ;
204 ViewState[ " NavigationToolTipTextFormatString " ] = tip;
205 }
206 }
207
208 /**/ /// <summary>
209 /// 获取或设置一个值,该值指示是否将页索引按钮用中文数字代替。
210 /// </summary>
211 /// <remarks>
212 /// 将该值设为true并且未使用图片按钮时,页索引按钮中的数值1、2、3等将会被中文字符一、二、三等代替。
213 /// </remarks>
214 [Browsable( true ),
215 Category( " 导航按钮 " ),
216 DefaultValue( false ),
217 Description( " 是否将页索引数值按钮用中文数字一、二、三等代替 " )]
218 public bool ChinesePageIndex
219 {
220 get
221 {
222 object obj = ViewState[ " ChinesePageIndex " ];
223 return (obj == null ) ? false :( bool )obj;
224 }
225 set
226 {
227 ViewState[ " ChinesePageIndex " ] = value;
228 }
229 }
230
231 /**/ /// <summary>
232 /// 获取或设置页索引数值导航按钮上文字的显示格式。
233 /// </summary>
234 /// <value>
235 /// 字符串,指定页索引数值按钮上文字的显示格式,默认值为 <see cref="String.Empty"/> ,即未设置该属性。 </value>
236 /// <remarks>
237 /// 使用NumericButtonTextFormatString属性指定页索引数值按钮的显示格式,如未设置该值时索引按钮文本将会是:1 2 3 ,设置该值将改变索引按钮文本的显示格式,
238 /// 如将该值设为“[{0}]”则索引文本会显示为:[1] [2] [3] ,将该值设为“-{0}-”则会使索引文本变为:-1- -2- -3- 。
239 /// </remarks>
240 [Browsable( true ),
241 DefaultValue( "" ),
242 Category( " 导航按钮 " ),
243 Description( " 页索引数值按钮上文字的显示格式 " )]
244 public string NumericButtonTextFormatString
245 {
246 get
247 {
248 object obj = ViewState[ " NumericButtonTextFormatString " ];
249 return (obj == null ) ? String.Empty:( string )obj;
250 }
251 set
252 {
253 ViewState[ " NumericButtonTextFormatString " ] = value;
254 }
255 }
256
257 /**/ /// <summary>
258 /// 获取或设置分页导航按钮的类型,即使用文字还是图片。
259 /// </summary>
260 /// <remarks>
261 /// 要使用图片按钮,您需要准备以下图片:从0到9的十个数值图片(当ShowPageIndex设为true时),第一页、上一页、下一页、最后一页及更多页()五个按钮图片(当ShowFirstLast及ShowPrevNext都设为true时),
262 /// 若需要使当前页索引的数值按钮不同于别的页索引数值按钮,则还需准备当前页索引的按钮图片;
263 /// 若需要使已禁用的第一页、上一页、下一页及最后一页按钮图片不同于正常的按钮图片,则还需准备这四个按钮在禁用状态下的图片;
264 /// <p><b> 图片文件的命名规则如下: </b></p>
265 /// <p> 从0到9十张数值按钮图片必须命名为“数值+ButtonImageNameExtension+ButtonImageExtension”,其中的ButtonImageNameExtension可以不用设置,
266 /// ButtonImageExtension是图片文件的后缀名,如 .gif或 .jpg等可以在浏览器中显示的任何图片文件类型。如页索引“1”的图片文件可命名为“1.gif”或“1.jpg”,
267 /// 当您有两套或更多套图片文件时,可以通过指定ButtonImageNameExtension属性值来区分不同套的图片,如第一套图片可以不用设ButtonImageNameExtension,则图片文件名类似于“1.gif”、“2.gif”等等,而第二套图片则设置ButtonImageNameExtension为“f”,图片文件名类似于“1f.gif”,“2f.gif”等等。 </p>
268 /// <p> 第一页按钮的图片文件名以“first”开头,上一页按钮图片名以“prev”开头,下一页按钮图片名以“next”开头,最后一页按钮图片名以“last”开头,更多页按钮图片名以“more”开头,是否使用ButtonImageNameExtension取决于数值按钮的设置及是否有更多套图片。 </p>
269 /// </remarks>
270 /// <example>
271 /// 以下代码片段示例如果使用图片按钮:
272 /// <p>
273 /// <code><![CDATA[
274 /// <Webdiyer:AspNetPager runat="server"
275 /// id="pager1"
276 /// OnPageChanged="ChangePage"
277 /// PagingButtonType="image"
278 /// ImagePath="images"
279 /// ButtonImageNameExtension="n"
280 /// DisabledButtonImageNameExtension="g"
281 /// ButtonImageExtension="gif"
282 /// CpiButtonImageNameExtension="r"
283 /// PagingButtonSpacing=5/>
284 /// ]]>
285 /// </code>
286 /// </p>
287 /// </example>
288 [Browsable( true ),
289 DefaultValue(PagingButtonType.Text),
290 Category( " 导航按钮 " ),
291 Description( " 分页导航按钮的类型,是使用文字还是图片 " )]
292 public PagingButtonType PagingButtonType
293 {
294 get
295 {
296 object obj = ViewState[ " PagingButtonType " ];
297 return (obj == null ) ? PagingButtonType.Text:(PagingButtonType)obj;
298 }
299 set
300 {
301 ViewState[ " PagingButtonType " ] = value;
302 }
303 }
304
305 /**/ /// <summary>
306 /// 获取或设置页导航数值按钮的类型,该值仅当PagingButtonType设为Image时才有效。
307 /// </summary>
308 /// <remarks>
309 /// 当您将PagingButtonType设为Image当又不想让页索引数值按钮使用图片时,可以将该值设为Text,这会使页索引数据按钮使用文本而不是图片按钮。
310 /// </remarks>
311 [Browsable( true ),
312 DefaultValue(PagingButtonType.Text),
313 Category( " 导航按钮 " ),
314 Description( " 页导航数值按钮的类型 " )]
315 public PagingButtonType NumericButtonType
316 {
317 get
318 {
319 object obj = ViewState[ " NumericButtonType " ];
320 return (obj == null ) ? PagingButtonType:(PagingButtonType)obj;
321 }
322 set
323 {
324 ViewState[ " NumericButtonType " ] = value;
325 }
326 }
327
328 /**/ /// <summary>
329 /// 获取或设置第一页、上一页、下一页和最后一页按钮的类型,该值仅当PagingButtonType设为Image时才有效。
330 /// </summary>
331 /// <remarks>
332 /// 当您将PagingButtonType设为Image但又不想让第一页、下一页、下一页和最后一页按钮使用图片,则可以将该值设为Text,这会使前面的四个按钮使用文本而不是图片按钮。
333 /// </remarks>
334 [Browsable( true ),
335 Category( " 导航按钮 " ),
336 DefaultValue(PagingButtonType.Text),
337 Description( " 第一页、上一页、下一页和最后一页按钮的类型 " )]
338 public PagingButtonType NavigationButtonType
339 {
340 get
341 {
342 object obj = ViewState[ " NavigationButtonType " ];
343 return (obj == null ) ? PagingButtonType:(PagingButtonType)obj;
344 }
345 set
346 {
347 ViewState[ " NavigationButtonType " ] = value;
348 }
349 }
350
351 /**/ /// <summary>
352 /// 获取或设置“更多页”()按钮的类型,该值仅当PagingButtonType设为Image时才有效。
353 /// </summary>
354 /// <remarks>
355 /// 当您将PagingButtonType设为Image但又不想让更多页()按钮使用图片时,可以将此值设为Text,这会使更多页按钮使用文本而不是图片按钮。
356 /// </remarks>
357 [Browsable( true ),
358 Category( " 导航按钮 " ),
359 DefaultValue(PagingButtonType.Text),
360 Description( " “更多页”()按钮的类型 " )]
361 public PagingButtonType MoreButtonType
362 {
363 get
364 {
365 object obj = ViewState[ " MoreButtonType " ];
366 return (obj == null ) ? PagingButtonType:(PagingButtonType)obj;
367 }
368 set
369 {
370 ViewState[ " MoreButtonType " ] = value;
371 }
372 }
373
374 /**/ /// <summary>
375 /// 获取或设置分页导航按钮之间的间距。
376 /// </summary>
377 [Browsable( true ),
378 Category( " 导航按钮 " ),
379 DefaultValue( typeof (Unit), " 5px " ),
380 Description( " 分页导航按钮之间的间距 " )]
381 public Unit PagingButtonSpacing
382 {
383 get
384 {
385 object obj = ViewState[ " PagingButtonSpacing " ];
386 return (obj == null ) ? Unit.Pixel( 5 ):(Unit.Parse(obj.ToString()));
387 }
388 set
389 {
390 ViewState[ " PagingButtonSpacing " ] = value;
391 }
392 }
393
394 /**/ /// <summary>
395 /// 获取或设置一个值,该值指示是否在页导航元素中显示第一页和最后一页按钮。
396 /// </summary>
397 [Browsable( true ),
398 Description( " 是否在页导航元素中显示第一页和最后一页按钮 " ),
399 Category( " 导航按钮 " ),
400 DefaultValue( true )]
401 public bool ShowFirstLast
402 {
403 get
404 {
405 object obj = ViewState[ " ShowFirstLast " ];
406 return (obj == null ) ? true :( bool )obj;
407 }
408 set {ViewState[ " ShowFirstLast " ] = value;}
409 }
410
411 /**/ /// <summary>
412 /// 获取或设置一个值,该值指示是否在页导航元素中显示上一页和下一页按钮。
413 /// </summary>
414 [Browsable( true ),
415 Description( " 是否在页导航元素中显示上一页和下一页按钮 " ),
416 Category( " 导航按钮 " ),
417 DefaultValue( true )]
418 public bool ShowPrevNext
419 {
420 get
421 {
422 object obj = ViewState[ " ShowPrevNext " ];
423 return (obj == null ) ? true :( bool )obj;
424 }
425 set {ViewState[ " ShowPrevNext " ] = value;}
426 }
427
428 /**/ /// <summary>
429 /// 获取或设置一个值,该值指示是否在页导航元素中显示页索引数值按钮。
430 /// </summary>
431 [Browsable( true ),
432 Description( " 是否在页导航元素中显示数值按钮 " ),
433 Category( " 导航按钮 " ),
434 DefaultValue( true )]
435 public bool ShowPageIndex
436 {
437 get
438 {
439 object obj = ViewState[ " ShowPageIndex " ];
440 return (obj == null ) ? true :( bool )obj;
441 }
442 set {ViewState[ " ShowPageIndex " ] = value;}
443 }
444
445 /**/ /// <summary>
446 /// 获取或设置为第一页按钮显示的文本。
447 /// </summary>
448 [Browsable( true ),
449 Description( " 第一页按钮上显示的文本 " ),
450 Category( " 导航按钮 " ),
451 DefaultValue( " <font face=\ " webdings\ " >9</font> " )]
452 public string FirstPageText
453 {
454 get
455 {
456 object obj = ViewState[ " FirstPageText " ];
457 return (obj == null ) ? " <font face=\ " webdings\ " >9</font> " :( string )obj;
458 }
459 set {ViewState[ " FirstPageText " ] = value;}
460 }
461
462 /**/ /// <summary>
463 /// 获取或设置为上一页按钮显示的文本。
464 /// </summary>
465 [Browsable( true ),
466 Description( " 上一页按钮上显示的文本 " ),
467 Category( " 导航按钮 " ),
468 DefaultValue( " <font face=\ " webdings\ " >3</font> " )]
469 public string PrevPageText
470 {
471 get
472 {
473 object obj = ViewState[ " PrevPageText " ];
474 return (obj == null ) ? " <font face=\ " webdings\ " >3</font> " :( string )obj;
475 }
476 set {ViewState[ " PrevPageText " ] = value;}
477 }
478
479 /**/ /// <summary>
480 /// 获取或设置为下一页按钮显示的文本。
481 /// </summary>
482 [Browsable( true ),
483 Description( " 下一页按钮上显示的文本 " ),
484 Category( " 导航按钮 " ),
485 DefaultValue( " <font face=\ " webdings\ " >4</font> " )]
486 public string NextPageText
487 {
488 get
489 {
490 object obj = ViewState[ " NextPageText " ];
491 return (obj == null ) ? " <font face=\ " webdings\ " >4</font> " :( string )obj;
492 }
493 set {ViewState[ " NextPageText " ] = value;}
494 }
495
496 /**/ /// <summary>
497 /// 获取或设置为最后一页按钮显示的文本。
498 /// </summary>
499 [Browsable( true ),
500 Description( " 最后一页按钮上显示的文本 " ),
501 Category( " 导航按钮 " ),
502 DefaultValue( " <font face=\ " webdings\ " >:</font> " )]
503 public string LastPageText
504 {
505 get
506 {
507 object obj = ViewState[ " LastPageText " ];
508 return (obj == null ) ? " <font face=\ " webdings\ " >:</font> " :( string )obj;
509 }
510 set {ViewState[ " LastPageText " ] = value;}
511 }
512
513 /**/ /// <summary>
514 /// 获取或设置在 <see cref="AspNetPager"/> 控件的页导航元素中同时显示的数值按钮的数目。
515 /// </summary>
516 [Browsable( true ),
517 Description( " 要显示的页索引数值按钮的数目 " ),
518 Category( " 导航按钮 " ),
519 DefaultValue( 10 )]
520 public int NumericButtonCount
521 {
522 get
523 {
524 object obj = ViewState[ " NumericButtonCount " ];
525 return (obj == null ) ? 10 :( int )obj;
526 }
527 set {ViewState[ " NumericButtonCount " ] = value;}
528 }
529
530 /**/ /// <summary>
531 /// 获取或设置一个值,该值指定是否显示已禁用的按钮。
532 /// </summary>
533 /// <remarks>
534 /// 该值用来指定是否显示已禁用的分页导航按钮,当当前页为第一页时,第一页和上一页按钮将被禁用,当当前页为最后一页时,下一页和最后一页按钮将被禁用,被禁用的按钮没有链接,在按钮上点击也不会有任何作用。
535 /// </remarks>
536 [Browsable( true ),
537 Category( " 导航按钮 " ),
538 Description( " 是否显示已禁用的按钮 " ),
539 DefaultValue( true )]
540 public bool ShowDisabledButtons
541 {
542 get
543 {
544 object obj = ViewState[ " ShowDisabledButtons " ];
545 return (obj == null ) ? true :( bool )obj;
546 }
547 set
548 {
549 ViewState[ " ShowDisabledButtons " ] = value;
550 }
551 }
552
553 #endregion
554
555 Image Buttons #region Image Buttons
556
557 /**/ /// <summary>
558 /// 获取或设置当使用图片按钮时,图片文件的路径。
559 /// </summary>
560 [Browsable( true ),
561 Category( " 图片按钮 " ),
562 Description( " 当使用图片按钮时,指定图片文件的路径 " ),
563 DefaultValue( null )]
564 public string ImagePath
565 {
566 get
567 {
568 string imgPath = ( string )ViewState[ " ImagePath " ];
569 if (imgPath != null )
570 imgPath = this .ResolveUrl(imgPath);
571 return imgPath;
572 }
573 set
574 {
575 string imgPath = value.Trim().Replace( " \\ " , " / " );
576 ViewState[ " ImagePath " ] = (imgPath.EndsWith( " / " )) ? imgPath:imgPath + " / " ;
577 }
578 }
579
580 /**/ /// <summary>
581 /// 获取或设置当使用图片按钮时,图片的类型,如gif或jpg,该值即图片文件的后缀名。
582 /// </summary>
583 [Browsable( true ),
584 Category( " 图片按钮 " ),
585 DefaultValue( " .gif " ),
586 Description( " 当使用图片按钮时,图片的类型,如gif或jpg,该值即图片文件的后缀名 " )]
587 public string ButtonImageExtension
588 {
589 get
590 {
591 object obj = ViewState[ " ButtonImageExtension " ];
592 return (obj == null ) ? " .gif " :( string )obj;
593 }
594 set
595 {
596 string ext = value.Trim();
597 ViewState[ " ButtonImageExtension " ] = (ext.StartsWith( " . " )) ? ext:( " . " + ext);
598 }
599 }
600
601 /**/ /// <summary>
602 /// 获取或设置自定义图片文件名的后缀字符串,以区分不同类型的按钮图片。
603 /// </summary>
604 /// <remarks><note> 注意: </note> 该值不是文件后缀名,而是为区分不同的图片文件而在图片名中加入的字符串,如:
605 /// 当前有两套按钮图片,其中一套中的“1”的图片名可为“1f.gif”,另一套中的“1”的图片名可起为“1n.gif”,其中的f和n即为ButtonImageNameExtension。 </remarks>
606 [Browsable( true ),
607 DefaultValue( null ),
608 Category( " 图片按钮 " ),
609 Description( " 自定义图片文件名的后缀字符串(非文件后缀名),如图片“1f.gif”的ButtonImageNameExtension即为“f” " )]
610 public string ButtonImageNameExtension
611 {
612 get
613 {
614 return ( string )ViewState[ " ButtonImageNameExtension " ];
615 }
616 set
617 {
618 ViewState[ " ButtonImageNameExtension " ] = value;
619 }
620 }
621
622 /**/ /// <summary>
623 /// 获取或设置当前页索引按钮的图片名后缀。
624 /// </summary>
625 /// <remarks>
626 /// 当 <see cref="PagingButtonType"/> 设为 Image 时,该属性允许您设置当前页索引数值按钮使用的图片名后缀字符,因此可以使当前页索引按钮与其它页索引按钮使用不同的图片,若未设置该值,则默认值为 <see cref="ButtonImageNameExtension"/> ,即当前页索引按钮与其它页索引按钮使用相同的图片。
627 /// </remarks>
628 [Browsable( true ),
629 DefaultValue( null ),
630 Category( " 图片按钮 " ),
631 Description( " 当前页索引按钮的图片名后缀字符串 " )]
632 public string CpiButtonImageNameExtension
633 {
634 get
635 {
636 object obj = ViewState[ " CpiButtonImageNameExtension " ];
637 return (obj == null ) ? ButtonImageNameExtension:( string )obj;
638 }
639 set
640 {
641 ViewState[ " CpiButtonImageNameExtension " ] = value;
642 }
643 }
644
645 /**/ /// <summary>
646 /// 获取或设置已禁用的页导航按钮图片名后缀字符串。
647 /// </summary>
648 /// <remarks>
649 /// 当 <see cref="PagingButtonType"/> 设为 Image 时, 该值允许您设置已禁用(即没有链接,因而点击后无反应)的页导航按钮(包括第一页、上一页、下一页、最后一页四个按钮)的图片文件名后缀字符串,因此可以使已禁用的页导航按钮不同于正常的页导航按钮。若未设置该值,则默认值为 <see cref="ButtonImageNameExtension"/> ,即已禁用的页导航按钮与正常的页导航按钮使用相同的图片。
650 /// </remarks>
651 [Browsable( true ),
652 DefaultValue( null ),
653 Category( " 图片按钮 " ),
654 Description( " 已禁用的页导航按钮的图片名后缀字符串 " )]
655 public string DisabledButtonImageNameExtension
656 {
657 get
658 {
659 object obj = ViewState[ " DisabledButtonImageNameExtension " ];
660 return (obj == null ) ? ButtonImageNameExtension:( string )obj;
661 }
662 set
663 {
664 ViewState[ " DisabledButtonImageNameExtension " ] = value;
665 }
666 }
667 /**/ /// <summary>
668 /// 指定当使用图片按钮时,图片的对齐方式。
669 /// </summary>
670
671 [Browsable( true ),
672 Description( " 指定当使用图片按钮时,图片的对齐方式 " ),
673 DefaultValue(ImageAlign.Baseline),
674 Category( " 图片按钮 " )]
675 public ImageAlign ButtonImageAlign
676 {
677 get
678 {
679 object obj = ViewState[ " ButtonImageAlign " ];
680 return (obj == null ) ? ImageAlign.Baseline:(ImageAlign)obj;
681 }
682 set {ViewState[ " ButtonImageAlign " ] = value;}
683 }
684
685
686 #endregion
687
688 Paging #region Paging
689
690 /**/ /// <summary>
691 /// 获取或设置是否启用url来传递分页信息。
692 /// </summary>
693 /// <remarks>
694 /// 启用Url分页方式是将用户欲访问的页索引通过Url来传递,由于该分页方式不使用页面向自身回发来传递数据,
695 /// 所以每次分页时所有的数据都恢复为初始值或需要重新获取。使用Url分页方式不支持动态改变分页控件的属性值,
696 /// 因暂时无法将新的属性值通过Url来传递给下一页。
697 /// </remarks>
698 /// <example> 以下示例说明如何用AspNetPager的Url分页方式对DataGrid进行分页(使用Access数据库):
699 /// <code><![CDATA[
700 /// <%@Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager"%>
701 /// <%@Import Namespace="System.Data.OleDb"%>
702 /// <%@ Import Namespace="System.Data"%>
703 /// <%@ Page Language="C#" debug=true%>
704 /// <HTML>
705 /// <HEAD>
706 /// <TITLE> Welcome to Webdiyer.com </TITLE>
707 /// <script runat="server">
708 /// OleDbConnection conn;
709 /// OleDbCommand cmd;
710 /// void Page_Load(object src,EventArgs e){
711 /// conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("access/aspnetpager.mdb"));
712 /// if(!Page.IsPostBack){
713 /// cmd=new OleDbCommand("select count(newsid) from wqnews",conn);
714 /// conn.Open();
715 /// pager.RecordCount=(int)cmd.ExecuteScalar();
716 /// conn.Close();
717 /// BindData();
718 /// }
719 /// }
720 ///
721 /// void BindData(){
722 /// cmd=new OleDbCommand("select newsid,heading,source,addtime from wqnews order by addtime desc",conn);
723 /// OleDbDataAdapter adapter=new OleDbDataAdapter(cmd);
724 /// DataSet ds=new DataSet();
725 /// adapter.Fill(ds,pager.PageSize*(pager.CurrentPageIndex-1),pager.PageSize,"news");
726 /// dg.DataSource=ds.Tables["news"];
727 /// dg.DataBind();
728 /// }
729 ///
730 /// void ChangePage(object src,PageChangedEventArgs e){
731 /// pager.CurrentPageIndex=e.NewPageIndex;
732 /// BindData();
733 /// }
734 ///
735 /// </script>
736 /// <meta http-equiv="Content-Language" content="zh-cn">
737 /// <meta http-equiv="content-type" content="text/html;charset=gb2312">
738 /// <META NAME="Generator" CONTENT="EditPlus">
739 /// <META NAME="Author" CONTENT="Webdiyer([email protected])">
740 /// </HEAD>
741 /// <body>
742 /// <form runat="server" ID="Form1">
743 /// <h2 align="center"> AspNetPager分页示例 </h2>
744 /// <asp:DataGrid id="dg" runat="server"
745 /// Width="760" CellPadding="4" Align="center" />
746 ///
747 /// <Webdiyer:AspNetPager runat="server" id="pager"
748 /// OnPageChanged="ChangePage"
749 /// HorizontalAlign="center"
750 /// style="MARGIN-TOP:10px;FONT-SIZE:16px"
751 /// PageSize="8"
752 /// ShowInputBox="always"
753 /// SubmitButtonStyle="border:1px solid #000066;height:20px;width:30px"
754 /// InputBoxStyle="border:1px #0000FF solid;text-align:center"
755 /// SubmitButtonText="转到"
756 /// UrlPaging="true"
757 /// UrlPageIndexName="pageindex" />
758 /// </form>
759 /// </body>
760 /// </HTML>
761 /// ]]> </code>
762 /// </example>
763 [Browsable( true ),
764 Category( " 分页 " ),
765 DefaultValue( false ),
766 Description( " 是否使用url传递分页信息的方式来分页 " )]
767 public bool UrlPaging
768 {
769 get
770 {
771 return urlPaging;
772 }
773 set
774 {
775 urlPaging = value;
776 }
777 }
778
779 /**/ /// <summary>
780 /// 获取或设置当启用Url分页方式时,在url中表示要传递的页索引的参数的名称。
781 /// </summary>
782 /// <remarks>
783 /// 该属性允许您自定义通过Url传递页索引时表示要传递的页索引的参数的名称,以避免与现有的参数名重复。
784 /// <p> 该属性的默认值是“page”,即通过Url分页时,显示在浏览器地址栏中的Url类似于: </p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?page=2
785 /// <p> 如将该值改为“pageindex”,则上面的Url将变为: </p><p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pageindex=2 </p>
786 /// </remarks>
787 [Browsable( true ),
788 DefaultValue( " page " ),
789 Category( " 分页 " ),
790 Description( " 当启用Url分页方式时,显示在url中表示要传递的页索引的参数的名称 " )]
791 public string UrlPageIndexName
792 {
793 get { return urlPageIndexName;}
794 set {urlPageIndexName = value;}
795 }
796
797 /**/ /// <summary>
798 /// 获取或设置当启用Url分页方式时,在url中表示要传递的页索引的参数的名称。
799 /// </summary>
800 /// <remarks>
801 /// 该属性允许您自定义通过Url传递页索引时表示要传递的页索引的参数的名称,以避免与现有的参数名重复。
802 /// <p> 该属性的默认值是“page”,即通过Url分页时,显示在浏览器地址栏中的Url类似于: </p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pagesize=20
803 /// <p> 如将该值改为“pagesize1”,则上面的Url将变为: </p><p> http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pagesize1=20 </p>
804 /// </remarks>
805 [Browsable( true ),
806 DefaultValue( " pagesize " ),
807 Category( " 分页 " ),
808 Description( " 当启用Url分页方式时,显示在url中表示要传递的记录数的参数的名称 " )]
809 public string UrlPageSize
810 {
811 get { return urlPageSize;}
812 set {urlPageSize = value;}
813 }
814
815 /**/ /// <summary>
816 /// 获取或设置当前显示页的索引。
817 /// </summary>
818 /// <remarks> 使用此属性来确定在 AspNetPager 控件中当前显示的页,当前显示的页的数字索引将以红色字体加粗显示。此属性还用于以编程的方式控制所显示的页。
819 /// <p> <b> 注意: </b> 不同于DataGrid控件的CurrentPageIndex,AspNetPager的CurrentPageIndex属性是从1开始的。 </p></remarks>
820 [ReadOnly( true ),
821 Browsable( false ),
822 Description( " 当前显示页的索引 " ),
823 Category( " 分页 " ),
824 DefaultValue( 1 ),
825 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
826 public int CurrentPageIndex
827 {
828 get
829 {
830 object cpage = ViewState[ " CurrentPageIndex " ];
831 int pindex = (cpage == null ) ? 1 :( int )cpage;
832 if (pindex > PageCount && PageCount > 0 )
833 return PageCount;
834 else if (pindex < 1 )
835 return 1 ;
836 return pindex;
837 }
838 set
839 {
840 int cpage = value;
841 if (cpage < 1 )
842 cpage = 1 ;
843 else if (cpage > this .PageCount)
844 cpage = this .PageCount;
845 ViewState[ " CurrentPageIndex " ] = cpage;
846 }
847 }
848
849 /**/ /// <summary>
850 /// 获取或设置需要分页的所有记录的总数。
851 /// </summary>
852 /// <remarks>
853 /// 当页面第一次加载时,应以编程方式将从存储过程或Sql语句中返回的数据表中所有要分页的记录的总数赋予该属性,AspNetPager会将其保存的ViewState中并在页面回发时从ViewState中获取该值,因此避免了每次分页都要访问数据库而影响分页性能。AspNetPager根据要分页的所有数据的总项数和 <see cref="PageSize"/> 属性来计算显示所有数据需要的总页数,即 <see cref="PageCount"/> 的值。
854 /// </remarks>
855 /// <example>
856 /// 下面的示例显示如何以编程方式将从Sql语句返回的记录总数赋给该属性:
857 /// <p>
858 /// <code><![CDATA[
859 /// <HTML>
860 /// <HEAD>
861 /// <TITLE> Welcome to Webdiyer.com </TITLE>
862 /// <script runat="server">
863 /// SqlConnection conn;
864 /// SqlCommand cmd;
865 /// void Page_Load(object src,EventArgs e)
866 /// {
867 /// conn=new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"]);
868 /// if(!Page.IsPostBack)
869 /// {
870 /// cmd=new SqlCommand("select count(id) from news",conn);
871 /// conn.Open();
872 /// pager.RecordCount=(int)cmd.ExecuteScalar();
873 /// conn.Close();
874 /// BindData();
875 /// }
876 /// }
877 ///
878 /// void BindData()
879 /// {
880 /// cmd=new SqlCommand("GetPagedNews",conn);
881 /// cmd.CommandType=CommandType.StoredProcedure;
882 /// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
883 /// cmd.Parameters.Add("@pagesize",pager.PageSize);
884 /// conn.Open();
885 /// dataGrid1.DataSource=cmd.ExecuteReader();
886 /// dataGrid1.DataBind();
887 /// conn.Close();
888 /// }
889 /// void ChangePage(object src,PageChangedEventArgs e)
890 /// {
891 /// pager.CurrentPageIndex=e.NewPageIndex;
892 /// BindData();
893 /// }
894 /// </script>
895 /// <meta http-equiv="Content-Language" content="zh-cn">
896 /// <meta http-equiv="content-type" content="text/html;charset=gb2312">
897 /// <META NAME="Generator" CONTENT="EditPlus">
898 /// <META NAME="Author" CONTENT="Webdiyer([email protected])">
899 /// </HEAD>
900 /// <body>
901 /// <form runat="server" ID="Form1">
902 /// <asp:DataGrid id="dataGrid1" runat="server" />
903 ///
904 /// <Webdiyer:AspNetPager id="pager" runat="server"
905 /// PageSize="8"
906 /// NumericButtonCount="8"
907 /// ShowCustomInfoSection="before"
908 /// ShowInputBox="always"
909 /// CssClass="mypager"
910 /// HorizontalAlign="center"
911 /// OnPageChanged="ChangePage" />
912 ///
913 /// </form>
914 /// </body>
915 /// </HTML>
916 /// ]]>
917 /// </code></p>
918 /// <p> 本示例使用的存储过程代码如下: </p>
919 /// <code><![CDATA[
920 /// CREATE procedure GetPagedNews
921 /// (@pagesize int,
922 /// @pageindex int)
923 /// as
924 /// set nocount on
925 /// declare @indextable table(id int identity(1,1),nid int)
926 /// declare @PageLowerBound int
927 /// declare @PageUpperBound int
928 /// set @PageLowerBound=(@pageindex-1)*@pagesize
929 /// set @PageUpperBound=@PageLowerBound+@pagesize
930 /// set rowcount @PageUpperBound
931 /// insert into @indextable(nid) select id from news order by addtime desc
932 /// select O.id,O.title,O.source,O.addtime from news O,@indextable t where O.id=t.nid
933 /// and t.id>@PageLowerBound and t.id <=@PageUpperBound order by t.id
934 /// set nocount off
935 /// GO
936 /// ]]>
937 /// </code>
938 /// </example>
939 [Browsable( false ),
940 Description( " 要分页的所有记录的总数,该值须在程序运行时设置,默认值为225是为设计时支持而设置的参照值。 " ),
941 Category( " Data " ),
942 DefaultValue( 225 )]
943 public int RecordCount
944 {
945 get
946 {
947 object obj = ViewState[ " Recordcount " ];
948 return (obj == null ) ? 0 :( int )obj;
949 }
950 set {ViewState[ " Recordcount " ] = value;}
951 }
952
953 /**/ /// <summary>
954 /// 获取当前页之后未显示的页的总数。
955 /// </summary>
956 [Browsable( false ),
957 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
958 public int PagesRemain
959 {
960 get
961 {
962 return PageCount - CurrentPageIndex;
963 }
964 }
965
966 /**/ /// <summary>
967 /// 获取或设置每页显示的项数。
968 /// </summary>
969 /// <remarks>
970 /// 该值获取或设置数据呈现控件每次要显示数据表中的的数据的项数,AspNetPager根据该值和 <see cref="RecordCount"/> 来计算显示所有数据需要的总页数,即 <see cref="PageCount"/> 的值。 </remarks>
971 /// <example> 以下示例将 <see cref="AspNetPager"/> 设置为允许每页显示8条数据:
972 /// <code>
973 /// <![CDATA[
974 ///
975 /// <Webdiyer:AspNetPager id="pager" runat="server" PageSize=8 OnPageChanged="ChangePage"/>
976 ///
977 /// ]]> </code></example>
978 [Browsable( true ),
979 Description( " 每页显示的记录数 " ),
980 Category( " 分页 " ),
981 DefaultValue( 10 )]
982 public int PageSize
983 {
984 get
985 {
986 object obj = ViewState[ " PageSize " ];
987 return (obj == null ) ? 10 :( int )obj;
988 }
989 set
990 {
991 ViewState[ " PageSize " ] = value;
992 }
993 }
994
995 /**/ /// <summary>
996 /// 获取在当前页之后还未显示的剩余记录的项数。
997 /// </summary>
998 [Browsable( false ),
999 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1000 public int RecordsRemain
1001 {
1002 get
1003 {
1004 if (CurrentPageIndex < PageCount)
1005 return RecordCount - (CurrentPageIndex * PageSize);
1006 return 0 ;}
1007 }
1008
1009
1010 /**/ /// <summary>
1011 /// 获取所有要分页的记录需要的总页数。
1012 /// </summary>
1013 [Browsable( false ),
1014 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1015 public int PageCount
1016 {
1017 get { return ( int )Math.Ceiling(( double )RecordCount / ( double )PageSize);}
1018 }
1019
1020
1021 #endregion
1022
1023 TextBox and Submit Button #region TextBox and Submit Button
1024
1025 /**/ /// <summary>
1026 /// 获取或设置页索引文本框的显示方式。
1027 /// </summary>
1028 /// <remarks>
1029 /// 页索引文件框允许用户手式输入要访问的页的索引,当页数非常多时,显示页索引文本框非常方便用户跳转到指定的页,默认情况下,该文本框只有在总页数大于或等于 <see cref="ShowBoxThreshold"/> 的值时才显示,否则不显示,要想该文本框任何时候都显示,请将其值设为Always,若希望任何时候都不显示,则应设为Never。
1030 /// </remarks>
1031 [Browsable( true ),
1032 Description( " 指定页索引文本框的显示方式 " ),
1033 Category( " 文本框及提交按钮 " ),
1034 DefaultValue(ShowInputBox.Auto)]
1035 public ShowInputBox ShowInputBox
1036 {
1037 get
1038 {
1039 object obj = ViewState[ " ShowInputBox " ];
1040 return (obj == null ) ? ShowInputBox.Auto:(ShowInputBox)obj;
1041 }
1042 set {ViewState[ " ShowInputBox " ] = value;}
1043 }
1044
1045 /**/ /// <summary>
1046 /// 获取或设置应用于页索引输入文本框的CSS类名。
1047 /// </summary>
1048 [Browsable( true ),
1049 Category( " 文本框及提交按钮 " ),
1050 DefaultValue( null ),
1051 Description( " 应用于页索引输入文本框的CSS类名 " )]
1052 public string InputBoxClass
1053 {
1054 get
1055 {
1056 return ( string )ViewState[ " InputBoxClass " ];
1057 }
1058 set
1059 {
1060 if (value.Trim().Length > 0 )
1061 ViewState[ " InputBoxClass " ] = value;
1062 }
1063 }
1064
1065 /**/ /// <summary>
1066 /// 获取或设置页索引输入文本框的CSS样式文本。
1067 /// </summary>
1068
1069 [Browsable( true ),
1070 Category( " 文本框及提交按钮 " ),
1071 DefaultValue( null ),
1072 Description( " 应用于页索引输入文本框的CSS样式文本 " )]
1073 public string InputBoxStyle
1074 {
1075 get
1076 {
1077 return ( string )ViewState[ " InputBoxStyle " ];
1078 }
1079 set
1080 {
1081 if (value.Trim().Length > 0 )
1082 ViewState[ " InputBoxStyle " ] = value;
1083 }
1084 }
1085
1086 /**/ /// <summary>
1087 /// 获取或设置页索引页索引输入文本框前的文本字符串值。
1088 /// </summary>
1089 [Browsable( true ),
1090 Category( " 文本框及提交按钮 " ),
1091 DefaultValue( null ),
1092 Description( " 页索引输入文本框前的文本内容字符串 " )]
1093 public string TextBeforeInputBox
1094 {
1095 get
1096 {
1097 return ( string )ViewState[ " TextBeforeInputBox " ];
1098 }
1099 set
1100 {
1101 ViewState[ " TextBeforeInputBox " ] = value;
1102 }
1103 }
1104
1105 /**/ /// <summary>
1106 /// 获取或设置页索引文本输入框后的文本内容字符串值。
1107 /// </summary>
1108 [Browsable( true ),
1109 DefaultValue( null ),
1110 Category( " 文本框及提交按钮 " ),
1111 Description( " 页索引输入文本框后的文本内容字符串 " )]
1112 public string TextAfterInputBox
1113 {
1114 get
1115 {
1116 return ( string )ViewState[ " TextAfterInputBox " ];
1117 }
1118 set
1119 {
1120 ViewState[ " TextAfterInputBox " ] = value;
1121 }
1122 }
1123
1124
1125 /**/ /// <summary>
1126 /// 获取或设置提交按钮上的文本。
1127 /// </summary>
1128 [Browsable( true ),
1129 Category( " 文本框及提交按钮 " ),
1130 DefaultValue( " go " ),
1131 Description( " 提交按钮上的文本 " )]
1132 public string SubmitButtonText
1133 {
1134 get
1135 {
1136 object obj = ViewState[ " SubmitButtonText " ];
1137 return (obj == null ) ? " go " :( string )obj;
1138 }
1139 set
1140 {
1141 if (value.Trim().Length > 0 )
1142 ViewState[ " SubmitButtonText " ] = value;
1143 }
1144 }
1145 /**/ /// <summary>
1146 /// 获取或设置应用于提交按钮的CSS类名。
1147 /// </summary>
1148 [Browsable( true ),
1149 Category( " 文本框及提交按钮 " ),
1150 DefaultValue( null ),
1151 Description( " 应用于提交按钮的CSS类名 " )]
1152 public string SubmitButtonClass
1153 {
1154 get
1155 {
1156 return ( string )ViewState[ " SubmitButtonClass " ];
1157 }
1158 set
1159 {
1160 ViewState[ " SubmitButtonClass " ] = value;
1161 }
1162 }
1163
1164 /**/ /// <summary>
1165 /// 获取或设置应用于提交按钮的CSS样式。
1166 /// </summary>
1167 [Browsable( true ),
1168 Category( " 文本框及提交按钮 " ),
1169 DefaultValue( null ),
1170 Description( " 应用于提交按钮的CSS样式 " )]
1171 public string SubmitButtonStyle
1172 {
1173 get
1174 {
1175 return ( string )ViewState[ " SubmitButtonStyle " ];
1176 }
1177 set
1178 {
1179 ViewState[ " SubmitButtonStyle " ] = value;
1180 }
1181 }
1182 /**/ /// <summary>
1183 /// 获取或设置自动显示页索引输入文本框的最低起始页数。
1184 /// </summary>
1185 /// <remarks>
1186 /// 当 <see cref="ShowInputBox"/> 设为Auto(默认)并且要分页的数据的总页数达到该值时会自动显示页索引输入文本框,默认值为30。该选项当 <see cref="ShowInputBox"/> 设为Never或Always时没有任何作用。
1187 /// </remarks>
1188 [Browsable( true ),
1189 Description( " 指定当ShowInputBox设为ShowInputBox.Auto时,当总页数达到多少时才显示页索引输入文本框 " ),
1190 Category( " 文本框及提交按钮 " ),
1191 DefaultValue( 30 )]
1192 public int ShowBoxThreshold
1193 {
1194 get
1195 {
1196 object obj = ViewState[ " ShowBoxThreshold " ];
1197 return (obj == null ) ? 30 :( int )obj;
1198 }
1199 set {ViewState[ " ShowBoxThreshold " ] = value;}
1200 }
1201
1202
1203 #endregion
1204
1205 SelectBox and Submit Button #region SelectBox and Submit Button
1206
1207 /**/ /// <summary>
1208 /// 获取或设置页索引文本框的显示方式。
1209 /// </summary>
1210 /// <remarks>
1211 /// 页索引文件框允许用户手式输入要访问的页的索引,当页数非常多时,显示页索引文本框非常方便用户跳转到指定的页,默认情况下,该文本框只有在总页数大于或等于 <see cref="ShowBoxThreshold"/> 的值时才显示,否则不显示,要想该文本框任何时候都显示,请将其值设为Always,若希望任何时候都不显示,则应设为Never。
1212 /// </remarks>
1213 [Browsable( true ),
1214 Description( " 指定页索引文本框的显示方式 " ),
1215 Category( " 分页记录数选择 " ),
1216 DefaultValue(ShowInputBox.Auto)]
1217 public ShowInputBox ShowSelectBox
1218 {
1219 get
1220 {
1221 object obj = ViewState[ " ShowSelectBox " ];
1222 return (obj == null ) ? ShowInputBox.Auto:(ShowInputBox)obj;
1223 }
1224 set {ViewState[ " ShowSelectBox " ] = value;}
1225 }
1226
1227 /**/ /// <summary>
1228 /// 获取或设置应用于页索引输入文本框的CSS类名。
1229 /// </summary>
1230 [Browsable( true ),
1231 Category( " 分页记录数选择 " ),
1232 DefaultValue( null ),
1233 Description( " 应用于页索引输入文本框的CSS类名 " )]
1234 public string SelectBoxClass
1235 {
1236 get
1237 {
1238 return ( string )ViewState[ " SelectBoxClass " ];
1239 }
1240 set
1241 {
1242 if (value.Trim().Length > 0 )
1243 ViewState[ " SelectBoxClass " ] = value;
1244 }
1245 }
1246
1247 /**/ /// <summary>
1248 /// 获取或设置页索引输入文本框的CSS样式文本。
1249 /// </summary>
1250
1251 [Browsable( true ),
1252 Category( " 分页记录数选择 " ),
1253 DefaultValue( null ),
1254 Description( " 应用于页索引输入文本框的CSS样式文本 " )]
1255 public string SelectBoxStyle
1256 {
1257 get
1258 {
1259 return ( string )ViewState[ " SelectBoxStyle " ];
1260 }
1261 set
1262 {
1263 if (value.Trim().Length > 0 )
1264 ViewState[ " SelectBoxStyle " ] = value;
1265 }
1266 }
1267
1268 /**/ /// <summary>
1269 /// 获取或设置页索引页索引输入文本框前的文本字符串值。
1270 /// </summary>
1271 [Browsable( true ),
1272 Category( " 分页记录数选择 " ),
1273 DefaultValue( " 每页 " ),
1274 Description( " 页索引输入文本框前的文本内容字符串 " )]
1275 public string TextBeforeSelectBox
1276 {
1277 get
1278 {
1279 return ( string )ViewState[ " TextBeforeSelectBox " ];
1280 }
1281 set
1282 {
1283 ViewState[ " TextBeforeSelectBox " ] = value;
1284 }
1285 }
1286
1287 /**/ /// <summary>
1288 /// 获取或设置页索引文本输入框后的文本内容字符串值。
1289 /// </summary>
1290 [Browsable( true ),
1291 DefaultValue( " 条 " ),
1292 Category( " 分页记录数选择 " ),
1293 Description( " 页索引输入文本框后的文本内容字符串 " )]
1294 public string TextAfterSelectBox
1295 {
1296 get
1297 {
1298 return ( string )ViewState[ " TextAfterSelectBox " ];
1299 }
1300 set
1301 {
1302 ViewState[ " TextAfterSelectBox " ] = value;
1303 }
1304 }
1305
1306
1307 /**/ /// <summary>
1308 /// 获取或设置提交按钮上的文本。
1309 /// </summary>
1310 [Browsable( true ),
1311 Category( " 分页记录数选择 " ),
1312 DefaultValue( " 设置 " ),
1313 Description( " 提交按钮上的文本 " )]
1314 public string SubmitButtonSelectText
1315 {
1316 get
1317 {
1318 object obj = ViewState[ " SubmitButtonSelectText " ];
1319 return (obj == null ) ? " 设置 " :( string )obj;
1320 }
1321 set
1322 {
1323 if (value.Trim().Length > 0 )
1324 ViewState[ " SubmitButtonSelectText " ] = value;
1325 }
1326 }
1327 /**/ /// <summary>
1328 /// 获取或设置自动显示页索引输入文本框的最低起始页数。
1329 /// </summary>
1330 /// <remarks>
1331 /// 当 <see cref="ShowInputBox"/> 设为Auto(默认)并且要分页的数据的总页数达到该值时会自动显示页索引输入文本框,默认值为30。该选项当 <see cref="ShowInputBox"/> 设为Never或Always时没有任何作用。
1332 /// </remarks>
1333 [Browsable( true ),
1334 Description( " 指定当ShowInputBox设为ShowInputBox.Auto时,当总页数达到多少时才显示页索引输入文本框 " ),
1335 Category( " 分页记录数选择 " ),
1336 DefaultValue( 30 )]
1337 public int ShowSelectBoxThreshold
1338 {
1339 get
1340 {
1341 object obj = ViewState[ " ShowSelectBoxThreshold " ];
1342 return (obj == null ) ? 30 :( int )obj;
1343 }
1344 set {ViewState[ " ShowSelectBoxThreshold " ] = value;}
1345 }
1346
1347
1348 #endregion
1349
1350 CustomInfoSection #region CustomInfoSection
1351
1352 /**/ /// <summary>
1353 /// 获取或设置显示用户自定义信息区的方式。
1354 /// </summary>
1355 /// <remarks>
1356 /// 该属性值设为Left或Right时会在分页导航元素左边或右边划出一个专门的区域来显示有关用户自定义信息,设为Never时不显示。
1357 /// </remarks>
1358 [Browsable( true ),
1359 Description( " 显示当前页和总页数信息,默认值为不显示,值为ShowCustomInfoSection.Left时将显示在页索引前,为ShowCustomInfoSection.Right时将显示在页索引后 " ),
1360 DefaultValue(ShowCustomInfoSection.Never),
1361 Category( " 自定义信息区 " )]
1362 public ShowCustomInfoSection ShowCustomInfoSection
1363 {
1364 get
1365 {
1366 object obj = ViewState[ " ShowCustomInfoSection " ];
1367 return (obj == null ) ? ShowCustomInfoSection.Never:(ShowCustomInfoSection)obj;
1368 }
1369 set {ViewState[ " ShowCustomInfoSection " ] = value;}
1370 }
1371
1372 /**/ /// <summary>
1373 /// 获取或设置用户自定义信息区文本的对齐方式。
1374 /// </summary>
1375 [Browsable( true ),
1376 Category( " 自定义信息区 " ),
1377 DefaultValue(HorizontalAlign.Left),
1378 Description( " 用户自定义信息区文本的对齐方式 " )]
1379 public HorizontalAlign CustomInfoTextAlign
1380 {
1381 get
1382 {
1383 object obj = ViewState[ " CustomInfoTextAlign " ];
1384 return (obj == null ) ? HorizontalAlign.Left:(HorizontalAlign)obj;
1385 }
1386 set
1387 {
1388 ViewState[ " CustomInfoTextAlign " ] = value;
1389 }
1390 }
1391
1392 /**/ /// <summary>
1393 /// 获取或设置用户自定义信息区的宽度。
1394 /// </summary>
1395 [Browsable( true ),
1396 Category( " 自定义信息区 " ),
1397 DefaultValue( typeof (Unit), " 40% " ),
1398 Description( " 用户自定义信息区的宽度 " )]
1399 public Unit CustomInfoSectionWidth
1400 {
1401 get
1402 {
1403 object obj = ViewState[ " CustomInfoSectionWidth " ];
1404 return (obj == null ) ? Unit.Percentage( 40 ):(Unit)obj;
1405 }
1406 set
1407 {
1408 ViewState[ " CustomInfoSectionWidth " ] = value;
1409 }
1410 }
1411
1523 [Browsable( false ),
2601
2608 /// 使用文字按钮。