機能
の作成に 1 週間以上を費やしました。
1. データグリッド、データリスト、およびその他のタイプのデータ表示コントロールをサポートします。理論的には、データソース コントロールが存在する限り、それを使用できます。
2. URL ページングをサポート URL ページングの各ページは検索エンジンで検索でき、URL の書き換えをサポートします。
3. 制御スタイルをカスタマイズ可能
1 /************************
を 1 行記述するだけでパッケージが完成します。
*************** ******************************
2 ** ファイル名: Pager.cs
3 ** 創設者: 楊祥武
4 ** 日付: 2005 年 7 月 27 日
5 ** 変更者:
6** 日付:
7 ** 説明:
8**
9 **---------------------------------------------- -- ------------------
10************************************************ ***** *******************/
11
12 システムを使用します。
13 System.Web.UI.WebControls を使用します。
14 System.Web.UI.HtmlControls を使用します。
15 System.Web を使用します。
16 System.Web.UI を使用します。
17 System.Text. RegularExpressions を使用します。
18
19 名前空間 MyCompany.Controls
20 {
21 /// <概要>
22 /// ページング制御
23 /// </まとめ>
24 パブリック クラス Pager: Label、INamingContainer
25 {
26 #region メンバー変数とコンストラクター
27 HttpContext コンテキスト = HttpContext.Current;
28 ラベル数ラベル;
29 ハイパーリンクの前ボタン。
30 ハイパーリンク次ボタン。
31 ハイパーリンクの最初のボタン。
32 ハイパーリンクの最後のボタン。
33 HyperLink[] ページングリンクボタン。
34
35 個のパブリック オーバーライド ControlCollection コントロール
36 {
37 ゲット
38 {
39 EnsureChildControls();
40 リターンベースコントロール。
41 }
42 }
43
44 保護されたオーバーライド void CreateChildControls()
45 {
46 コントロール.Clear();
47
48 追加カウントラベル();
49
50 AddPageButtons();
51
52 AddPreviousNextHyperLinks();
53
54 AddFirstLastHyperLinks();
55 }
56 #エンドリージョン
57
58 #region レンダリング方法
59 protected オーバーライド void Render(HtmlTextWriter ライター)
60 {
61 // 変更されたページの合計数が 1 以下の場合、コントロールは表示されません
62 // int totalPages = CalculateTotalPages();
63 //
64 // if (totalPages <= 1)
65 // 戻ります。
66
67 AddAttributesToRender(ライター);
68
69 Writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass, false);
70
71 RenderCountLabel(ライター);
72
73 レンダーファースト(ライター);
74
75 前をレンダリング(ライター);
76
77 RenderPagingButtons(ライター);
78
79 レンダーネクスト(ライター);
80
81 レンダーラスト(ライター);
82}
83
84 void RenderCountLabel(HtmlTextWriter ライター)
85 {
86 countLabel.RenderControl(ライター);
87
88 LiteralControl l = new LiteralControl(" ");
89 l.RenderControl(ライター);
90}
91
92 void RenderFirst (HtmlTextWriter ライター)
93 {
94 最初のボタン.RenderControl(ライター);
95
96 LiteralControl l = new LiteralControl(" ");
97 l.RenderControl(ライター);
98 }
99
100 void RenderLast (HtmlTextWriter ライター)
101 {
102 lastButton.RenderControl(ライター);
103
104 LiteralControl l = new LiteralControl(" ");
105 l.RenderControl(ライター);
106 }
107
108 void RenderPrevious (HtmlTextWriter ライター)
109 {
110 前ボタン.RenderControl(ライター);
111
112 LiteralControl l = new LiteralControl(" ");
113 l.RenderControl(ライター);
114 }
115
116 void RenderNext(HtmlTextWriter ライター)
117 {
118 次のボタン.RenderControl(ライター);
119
120 LiteralControl l = new LiteralControl(" ");
121 l.RenderControl(ライター);
122 }
123
124 private void RenderButtonRange(int start, int end, HtmlTextWriter ライター)
125 {
126 for (int i = 開始; i < 終了; i++)
127 {
128 if (PageIndex == i)
129 {
130 リテラル l = new リテラル();
131 l.Text = "<font color =red>" + (i + 1).ToString() + "</font>";
132
133 l.RenderControl(ライター);
134}
135 その他
136 {
137 ページングリンクボタン[i].RenderControl(ライター);
138 }
139 if (i < (end - 1))
140 ライター.Write(" ");
141 }
142
143 LiteralControl l1 = new LiteralControl(" ");
144 l1.レンダーコントロール(ライター);
145 }
146
147 プライベート void RenderPagingButtons(HtmlTextWriter ライター)
148 {
149 int totalPages;
150
151 totalPages = CalculateTotalPages();
152
153 if (合計ページ数 <= 10)
154 {
155 RenderButtonRange(0, totalPages, ライター);
156 }
157 その他
158 {
159 int lowerBound = (PageIndex - 4);
160 int upperBount = (PageIndex + 6);
161
162 if ( lowerBound <= 0)
163 下限 = 0;
164
165 if (PageIndex <= 4)
166 RenderButtonRange(0, 10, ライター);
167
168 else if (PageIndex < (totalPages - 5))
169 RenderButtonRange( lowerBound, (PageIndex + 6), Writer);
170
171 else if (PageIndex >= (totalPages - 5))
172 RenderButtonRange((totalPages - 10), totalPages, Writer);
173}
174 }
175
176 #エンドリージョン
177
178 #リージョン制御ツリーメソッド
179 /// <概要>
180 /// 情報タグ
181 /// </概要>
182 無効のAddCountLabel()
183 {
184 カウントラベル = 新しいラベル();
185 カウントラベル.ID = "カウントラベル";
186 countLabel.Text = string.Format(text, CalculateTotalPages().ToString("n0"));
187
188 コントロールの追加(カウントラベル);
189 }
190
191 プライベート void AddPageButtons()
192 {
193 ページングリンクボタン = 新しい HyperLink[CalculateTotalPages()];
194
195 for (int i = 0; i < pagingLinkButtons.Length; i++)
196 {
197 ページングリンクボタン[i] = 新しい HyperLink();
198 ページングリンクボタン[i].EnableViewState = false;
199 ページングリンクボタン[i].Text = (i + 1).ToString();
200 ページングリンクボタン[i].ID = i.ToString();
201 ページングリンクボタン[i].CssClass = linkCss;
202 ページングリンクボタン[i].NavigateUrl = GetHrefString(i);
203
204 Controls.Add(pagingLinkButtons[i]);
205 }
206 }
207
208 /// <概要>
209 /// ホームページの最後のページ
210 /// </まとめ>
211 無効なAddFirstLastHyperLinks()
212 {
213 最初のボタン = 新しい HyperLink();
214 firstButton.ID = "最初";
215 firstButton.Text = "ホーム";
216 if(PageIndex != 0 && CalculateTotalPages() > 0)
217 {
218 最初のボタン.NavigateUrl = GetHrefString(0);
219 }
220 その他
221 {
222 最初のボタン.Enabled = false;
223 }
224
225 Controls.Add(firstButton);
226
227 最後のボタン = 新しいハイパーリンク();
228 lastButton.ID = "最後";
229 lastButton.Text = "最後のページ";
230 if(PageIndex != CalculateTotalPages() - 1)
231 {
232 lastButton.NavigateUrl = GetHrefString(CalculateTotalPages() - 1);
233 }
234 その他
235 {
236 最後のボタン.Enabled = false;
237 }
238 コントロールの追加(最後のボタン);
239 }
240
241 /// <概要>
242 /// 前のページ 次のページ
243 /// </まとめ>
244 無効なAddPreviousNextHyperLinks()
245 {
246 前のボタン = 新しい HyperLink();
247 前ボタン.ID = "前";
248 前ボタン.Text = "前のページ";
249 if (以前あり)
250{
251 前ボタン.NavigateUrl = GetHrefString(PageIndex - 1);
252 }
253 その他
254 {
255 前ボタン.Enabled = false;
256 }
257 Controls.Add(previousButton);
258
259 次のボタン = 新しいハイパーリンク();
260 nextButton.ID = "次へ";
261 nextButton.Text = "次のページ";
262 if(次がある)
263 {
264 次のボタン.NavigateUrl = GetHrefString(PageIndex + 1);
265 }
266 その他
267 {
268 次のボタンを有効にする = false;
269}
270 コントロール.Add(nextButton);
271 }
272 #エンドリージョン
273
274 #region プライベート プロパティ
275 プライベート ブール
276 {
277 ゲット
278 {
279 if (PageIndex > 0)
280 true を返します。
281
282 偽を返します。
283}
284 }
285
286 プライベート ブール HasNext
287 {
288 ゲット
289 {
290 if (PageIndex + 1 < CalculateTotalPages() )
291 true を返します。
292
293 偽を返します。
294 }
295 }
296 #エンドリージョン
297
298 #region ヘルパー メソッドとパブリック プロパティ
299
300 /// <概要>
301 /// ページング ナビゲーション ボタンのハイパーリンク文字列を取得します
302 /// </まとめ>
303 /// <param name="pageIndex">ページング ボタンに対応するページ インデックス</param>
304 /// <returns>ページング ナビゲーション ボタンのハイパーリンク文字列</returns>
305 プライベート文字列 GetHrefString(int pageIndex)
306 {
307 文字列 URL = Page.Request.RawUrl;
308
309 if (Regex.IsMatch(url, @"(d+).shtml", RegexOptions.IgnoreCase))
310 {
311 url = Regex.Replace(url, @"(d+).shtml", pageIndex + ".shtml");
312 }
313
314 if (Regex.IsMatch(url, @"PageIndex=(d+)", RegexOptions.IgnoreCase))
315 {
316 url = Regex.Replace(url, @"PageIndex=(d+)", "PageIndex=" + pageIndex.ToString());
317 }
318
319 戻り値 Page.Server.UrlPathEncode(url);
320 }
321
322 パブリック int CalculateTotalPages()
323 {
324 int totalPagesAvailable;
325
326 if (TotalRecords == 0)
327 0 を返す;
328
329 totalPagesAvailable = 合計レコード数 / ページサイズ;
330
331 if ((TotalRecords % PageSize) > 0)
合計 332 ページ利用可能++;
333
334 totalPagesAvailable を返します。
335 }
336
337 /// <概要>
338 /// 現在のページ
339 /// </まとめ>
340 public int PageIndex
341 {
342 ゲット
343 {
344 int_pageIndex = 0;
345
346 if ((!Page.IsPostBack) && (context.PageIndex > 0))
347 _pageIndex = context.PageIndex;
348 その他
349 _pageIndex = Convert.ToInt32(ViewState["PageIndex"]);
350
351 if (_pageIndex < 0)
352 0 を返す;
353 その他
354 {
355 if (_pageIndex > CalculateTotalPages()-1)
356 戻り値 CalculateTotalPages()-1;
357 その他
358 _pageIndexを返す;
359 }
360 }
361セット
362 {
363 ViewState["PageIndex"] = 値;
364 }
365 }
366
367 /// <概要>
368 ///ページごとのレコード数
369 /// </概要>
370 public int PageSize
371 {
372 ゲット
373 {
374 int pageSize = Convert.ToInt32(ViewState["PageSize"]);
375
376 if (ページサイズ == 0)
377 {
378 10 を返します。
379 }
380
381 戻りページサイズ;
382 }
383セット
384 {
385 ViewState["PageSize"] = 値;
386 }
387
388 }
389
390 /// <概要>
391 ///レコードの総数
392 /// </概要>
393 public int TotalRecords
394 {
395ゲット
396 {
397 return Convert.ToInt32(ViewState["TotalRecords"]);
398 }
399セット
400{
401 ViewState["TotalRecords"] = 値;
402 }
403 }
404
405 プライベート文字列テキスト = "合計 {0} ページ";
406
407 プライベート文字列 linkCss = "";
408 /// <概要>
409 /// リンクスタイル
410 /// </まとめ>
411 パブリック文字列 LinkCss
412 {
413 取得 { リンク Css を返す }
414 セット{linkCss =値;}
415 }
416
417 プライベート文字列 textCss = "";
418 /// <概要>
419 /// テキストスタイル
420 /// </まとめ>
421 パブリック文字列 TextCss
422 {
423 取得 { textCss を返す }
424 セット{textCss =値;}
425 }
426
427 パブリック文字列 TextFormat
428 {
429 ゲット
430 {
431 テキストを返します。
432 }
433セット
434 {
435 テキスト = 値;
436 }
437 }
438
439 #エンドリージョン
440 }
441 }
442
ページにこれを書くだけです:
1 <%@ 制御言語="c#" %>
2 <%@ 登録 TagPrefix="Anchor" Namespace="MyCompany.Controls" Assembly="MyCompany.Controls" %>
3 <ANCHOR:PAGER id="Pager1" runat="server"></ANCHOR:PAGER>
4