Codes / RepeaterPaging


Codes

Repeater のページング

掲示板やらで見ているとみんな DataGrid? ばかり使っていて Repeater を使っていないようだ。確かに DataGrid? には便利な機能があるので、それはわからないでもないけど。

  • 偶数列スタイル
    • <td class='<%# Container.ItemIndex? % 2 == 0 ? "item" : "alt" %>'>
    • もしくは、<asp:PlaceHolder?(あるいは他の) runat="server" visible='<%# Container.ItemIndex? % 2 == 0>'>
  • ページング
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebTest1 {
	/// <summary><see cref="WebTest1.Pager"/> コントロールの <see cref="WebTest1.Pager.PageIndexChanged"/> イベントのデータを提供します。このクラスは継承できません。</summary>
	public sealed class PagerPageChangedEventArgs: EventArgs {
		#region Members
		private object commandSource;
		private int newPageIndex;
		#endregion

		#region Constructors
		/// <summary><see cref="WebTest1.PagerPageChangedEventArgs"/> クラスの新しいインスタンスを初期化します。</summary>
		/// <param name="commandSource">コマンドのソース。 </param>
		/// <param name="newPageIndex"><see cref="WebTest1.Pager"/> コントロールのページ選択要素でユーザーが選択したページのインデックス。 </param>
		public PagerPageChangedEventArgs(object commandSource, int newPageIndex) {
			this.commandSource = commandSource;
			this.newPageIndex = newPageIndex;
		}
		#endregion

		#region Properties
		/// <summary>コマンドのソースを取得します。</summary>
		public object CommandSource { 
			get { 
				return commandSource;
			}
		}

		/// <summary><see cref="WebTest1.Pager"/>コントロールのページ選択要素でユーザーが選択したページのインデックスを取得します。</summary>
		public int NewPageIndex {
			get {
				return newPageIndex;
			}
		}
		#endregion
	}

	/// <summary><see cref="WebTest1.Pager"/> コントロールの <see cref="WebTest1.Pager.PageIndexChanged"/> イベントを処理するメソッドを表します。</summary>
	public delegate void PagerPageChangedEventHandler(object sender, PagerPageChangedEventArgs e);
	
	/// <summary>ページ切り替え可能なデータを供給します。</summary>
	// 対象連結コントロールにデータを供給するため、IListSource を実装している
	// 子コントロールに対してid空間を生成するために、INamingContainer を実装している
	public class Pager: System.Web.UI.WebControls.WebControl, IListSource, INamingContainer {
		#region Web フォーム デザイナで生成されたコード 
		override protected void OnInit(EventArgs e) {
			//
			// CODEGEN: この呼び出しは、ASP.NET Web フォーム デザイナで必要です。
			//
			InitializeComponent();
			base.OnInit(e);
		}
		
		/// <summary>
		///		デザイナ サポートに必要なメソッドです。- このメソッドの内容を
		///		コード エディタで変更しないでください。
		/// </summary>
		private void InitializeComponent() {
		}
		#endregion

		#region Members
		// デフォルト値
		private const string DataMemberDefaultValue = "";
		private const int PageSizeDefaultValue = 0;
		private const bool AllowPagingDefaultValue = true;
		private const int CurrentPageIndexDefaultValue = 0;
		private const string PrevPageTextDefaultValue = "&lt;";
		private const string NextPageTextDefaultValue = "&gt;";
		private const bool PrevEnabledDefaultValue = false;
		private const bool NextEnabledDefaultValue = false;

		// ViewState 項目名
		private const string DataSourceStateName = "a";
		private const string DataMemberStateName = "b";
		private const string PageSizeStateName = "c";
		private const string AllowPagingStateName = "d";
		private const string CurrentPageIndexStateName = "e";
		private const string PrevPageTextStateName = "f";
		private const string NextPageTextStateName = "g";
		private const string PrevEnabledStateName = "h";
		private const string NextEnabledStateName = "i";

		// 子コントロール
		private LinkButton prev;
		private Literal prevText;
		private Literal space;
		private LinkButton next;
		private Literal nextText;
		#endregion

		#region Properties
		/// <summary>項目の作成に使用されるデータソースです。</summary>
		[Category("データ"), Description("項目の作成に使用されるデータソースです。"), Bindable(true)]
		public object DataSource {
			get {
				return ViewState[DataSourceStateName];
			}
			set {
				if (value != null)
					ViewState[DataSourceStateName] = value;
				else
					ViewState.Remove(DataSourceStateName);
			}
		}

		/// <summary>各ページに表示するデータソースの項目の数です。</summary>
		[Category("データ"), Description("データソースの中で、データ取得に使用される項目を指定します。"), DefaultValue(DataMemberDefaultValue)]
		public string DataMember {
			get {
				string s = ViewState[DataMemberStateName] as string;
				return s != null ? s : DataMemberDefaultValue;
			}
			set {
				if (value != null && value != DataMemberDefaultValue)
					ViewState[DataMemberStateName] = value;
				else
					ViewState.Remove(DataMemberStateName);
			}
		}

		/// <summary>各ページに表示するデータソースの項目の数です。</summary>
		[Category("ページング"), Description("各ページに表示するデータソースの項目の数です。"), DefaultValue(PageSizeDefaultValue)]
		public int PageSize {
			get {
				object o = ViewState[PageSizeStateName];
				return o != null ? (int)o : PageSizeDefaultValue;
			}
			set {
				if (value < 0)
					throw new ArgumentOutOfRangeException("PageSize", value, "PageSizeに0未満の値は設定できません。");
				if (value != PageSizeDefaultValue)
					ViewState[PageSizeStateName] = value;
				else
					ViewState.Remove(PageSizeStateName);
			}
		}

		/// <summary>ページングを行うかどうかを指定します。</summary>
		[Category("ページング"), Description("ページングを行うかどうかを指定します。"), DefaultValue(AllowPagingDefaultValue)]
		public bool AllowPaging {
			get {
				object o = ViewState[AllowPagingStateName];
				return o != null ? (bool)o : AllowPagingDefaultValue;
			}
			set {
				if (value != AllowPagingDefaultValue)
					ViewState[AllowPagingStateName] = value;
				else
					ViewState.Remove(AllowPagingStateName);
			}
		}

		/// <summary>現在表示されているページのインデックスを取得または設定します。</summary>
		[Browsable(false)]
		public int CurrentPageIndex {
			get {
				object o = ViewState[CurrentPageIndexStateName];
				return o != null ? (int)o : CurrentPageIndexDefaultValue;
			}
			set {
				if (value < 0)
					throw new ArgumentOutOfRangeException("CurrentPageIndex", value, "CurrentPageIndexに0未満の値は設定できません。");
				if (value != CurrentPageIndexDefaultValue)
					ViewState[CurrentPageIndexStateName] = value;
				else
					ViewState.Remove(CurrentPageIndexStateName);
			}
		}

		/// <summary>前のページボタンに表示するテキストです。</summary>
		[Category("ページング"), Description("前のページボタンに表示するテキストです。"), DefaultValue(PrevPageTextDefaultValue)]
		public string PrevPageText {
			get {
				string s = ViewState[PrevPageTextStateName] as string;
				return s != null ? s : PrevPageTextDefaultValue;
			}
			set {
				if (value != PrevPageTextDefaultValue && value != null)
					ViewState[PrevPageTextStateName] = value;
				else
					ViewState.Remove(PrevPageTextStateName);
			}
		}

		/// <summary>次のページボタンに表示するテキストです。</summary>
		[Category("ページング"), Description("次のページボタンに表示するテキストです。"), DefaultValue(NextPageTextDefaultValue)]
		public string NextPageText {
			get {
				string s = ViewState[NextPageTextStateName] as string;
				return s != null ? s : NextPageTextDefaultValue;
			}
			set {
				if (value != NextPageTextDefaultValue && value != null)
					ViewState[NextPageTextStateName] = value;
				else
					ViewState.Remove(NextPageTextStateName);
			}
		}

		/// <summary>実際にページングを行うかどうか</summary>
		private bool Paging {
			get {
				return AllowPaging && PageSize > 0;
			}
		}

		/// <summary>前ボタンが押せるか</summary>
		private bool PrevEnabled {
			get {
				object o = ViewState[PrevEnabledStateName];
				return o != null ? (bool)o : PrevEnabledDefaultValue;
			}
			set {
				if (value != PrevEnabledDefaultValue)
					ViewState[PrevEnabledStateName] = value;
				else
					ViewState.Remove(PrevEnabledStateName);
			}
		}

		/// <summary>次ボタンが押せるか</summary>
		private bool NextEnabled {
			get {
				object o = ViewState[NextEnabledStateName];
				return o != null ? (bool)o : NextEnabledDefaultValue;
			}
			set {
				if (value != NextEnabledDefaultValue)
					ViewState[NextEnabledStateName] = value;
				else
					ViewState.Remove(NextEnabledStateName);
			}
		}
		#endregion

		#region Events
		/// <summary>ページ選択要素の 1 つがクリックされると発生します。</summary>
		[Category("Action")]
		public event PagerPageChangedEventHandler PageIndexChanged;
		#endregion

		#region Methods
		protected override void CreateChildControls() {
			base.CreateChildControls();

			prev = new LinkButton();
			prev.ID = "prev";
			prev.EnableViewState = false;
			prev.Visible = false;
			prev.Click += new EventHandler(PrevClick);
			Controls.Add(prev);

			prevText = new Literal();
			prevText.ID = "prevText";
			prevText.EnableViewState = false;
			prevText.Visible = false;
			Controls.Add(prevText);

			space = new	Literal();
			space.ID = "space";
			space.EnableViewState = false;
			space.Visible = true;
			space.Text = "&nbsp;";
			Controls.Add(space);

			next = new LinkButton();
			next.ID = "next";
			next.EnableViewState = false;
			next.Visible = false;
			next.Click += new EventHandler(NextClick);
			Controls.Add(next);

			nextText = new Literal();
			nextText.ID = "nextText";
			nextText.EnableViewState = false;
			nextText.Visible = false;
			Controls.Add(nextText);
		}

		protected override void Render(System.Web.UI.HtmlTextWriter writer) {
			WritePaging(writer, PrevEnabled, PrevPageText, prev, prevText);
			WritePaging(writer, NextEnabled, NextPageText, next, nextText);
			base.Render(writer);
		}

		protected virtual void OnPageIndexChanged(PagerPageChangedEventArgs e) {
			if (PageIndexChanged != null)
				PageIndexChanged(this, e);
		}

		private void WritePaging(System.Web.UI.HtmlTextWriter writer, bool enabled, string pageText, LinkButton button, Literal buttonLiteral) {
			if (enabled) {
				button.Text = pageText;
				button.Visible = true;
			} else {
				buttonLiteral.Text = pageText;
				buttonLiteral.Visible = true;
			}
		}

		private void PrevClick(object sender, EventArgs e) {
			OnPageIndexChanged(new PagerPageChangedEventArgs(this, CurrentPageIndex - 1));
		}

		private void NextClick(object sender, EventArgs e) {
			OnPageIndexChanged(new PagerPageChangedEventArgs(this, CurrentPageIndex + 1));
		}
		#endregion

		#region IListSource メンバ
		public System.Collections.IList GetList() {
			IList list = null;
			if (DataSource != null) {
				IListSource listSource = DataSource as IListSource;
				if (listSource != null) {
					list = listSource.GetList();
				} else {
					list = DataSource as IList;
				}
			} else {
				list = null;
			}
			
			if (Paging) {
				// 対象ページ以降の件数
				int restCount = list.Count - CurrentPageIndex * PageSize;
				
				int size = restCount;
				if (size > PageSize)
					size = PageSize;
				if (size <= 0) {
					if (CurrentPageIndex == 0)
						return null;
					else
						throw new IndexOutOfRangeException("CurrentPageIndex はページ数未満でなければなりません");
				}

				object[] result = new object[size];
				for (int i = 0; i < size; i++)
					result[i] = list[CurrentPageIndex * PageSize + i];
				
				PrevEnabled = CurrentPageIndex > 0;
				NextEnabled = restCount > PageSize;
				
				return result;
			} else {
				PrevEnabled = NextEnabled = false;
				return list;
			}
		}

		public bool ContainsListCollection {
			get {
				// 本コントロールはリストコレクションを保持しない
				return false;
			}
		}
		#endregion
	}
}

test post

slurpalay? (2013-06-19 (水) 17:39:22)

Enjoy your blog )
http://wvglnnvzj.com my blog


Test, just a test

XRumerTest? (2013-05-08 (水) 01:01:58)

Hello. And Bye.


最新の20件

2015-05-01
  • Codes/RepeaterPaging
2006-09-22 2005-08-04 2005-07-28 2005-07-07 2005-07-06 2005-07-01

  • counter: 1414
  • today: 2
  • yesterday: 1
  • online: 1