掲示板やらで見ているとみんな DataGrid? ばかり使っていて Repeater を使っていないようだ。確かに DataGrid? には便利な機能があるので、それはわからないでもないけど。
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 = "<"; private const string NextPageTextDefaultValue = ">"; 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 = " "; 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 } }
slurpalay? (2013-06-19 (水) 17:39:22)
Enjoy your blog )
http://wvglnnvzj.com my blog
XRumerTest? (2013-05-08 (水) 01:01:58)
Hello. And Bye.