自制内容分页控件

本文介绍了一个自定义的ASP.NET分页控件ContentPager的实现细节,该控件支持缓存模式和非缓存模式的数据分页显示,并通过事件机制通知页面切换和内容改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.IO;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace JojoEmpire
{
 #region PagingMode enum
 public enum PagingMode
 {
  Cached,
  NonCached
 }
 #endregion

 #region PageChangedEventArgs class
 public class PageChangedEventArgs : EventArgs
 {
  public int OldPageIndex;
  public int NewPageIndex;
 }
 #endregion

 #region ContentChangedEventArgs class
 public class ContentChangedEventArgs : EventArgs
 {
  public string Content;
 }
 #endregion

 #region ContentPager Control
 [DefaultEvent("PageIndexChanged")]
 [ToolboxData("<{0}:ContentPager runat=/"server/" />")]
 public class ContentPager : WebControl, INamingContainer
 {
  #region  PRIVATE DATA MEMBERS
  // ***********************************************************************
  // PRIVATE members
  private string CacheKeyName
  {
   get {return Page.Request.FilePath + "_" + UniqueID + "_Data";}
  }
  // ***********************************************************************
  #endregion

  #region CTOR(s)
  // ***********************************************************************
  // Ctor
  public ContentPager() : base()
  {
   PagingMode = PagingMode.Cached;
   CurrentPageIndex = 0;
   TotalPages = -1;
   SourceContent = "";
  }
  // ***********************************************************************
  #endregion

  #region PUBLIC PROGRAMMING INTERFACE
  // ***********************************************************************
  // METHOD ClearCache
  // Removes any data cached for paging
  public void ClearCache()
  {
   if (PagingMode == PagingMode.Cached)
    Page.Cache.Remove(CacheKeyName);
  }
  // ***********************************************************************

  // ***********************************************************************
  // EVENT PageIndexChanged
  // Fires when the pager is about to switch to a new page
  public delegate void PageChangedEventHandler(object sender, PageChangedEventArgs e);
  public event PageChangedEventHandler PageIndexChanged;
  protected virtual void OnPageIndexChanged(PageChangedEventArgs e)
  {
   if (PageIndexChanged != null)
    PageIndexChanged(this, e);
  }
  // ***********************************************************************

  // ***********************************************************************
  // EVENT SourceContentChanged
  // Fires when the content is about to change
  public delegate void ContentChangedEventHandler(object sender, ContentChangedEventArgs e);
  public event ContentChangedEventHandler SourceContentChanged;
  protected virtual void OnSourceContentChanged(ContentChangedEventArgs e)
  {
   if (SourceContentChanged != null)
    SourceContentChanged(this, e);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY PagingMode
  [Description("Indicates whether the data are retrieved page by page or can be cached")]
  public PagingMode PagingMode
  {
   get {return (PagingMode) ViewState["PagingMode"];}
   set {ViewState["PagingMode"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY SourceContent
  [Description("Gets and sets the source content")]
  public string SourceContent
  {
   get {return Convert.ToString(ViewState["SourceContent"]);}
   set {ViewState["SourceContent"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY CurrentPageIndex
  [Description("Gets and sets the index of the currently displayed page")]
  public int CurrentPageIndex
  {
   get {return Convert.ToInt32(ViewState["CurrentPageIndex"]);}
   set {ViewState["CurrentPageIndex"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // PROPERTY TotalPages
  // Gets and sets the number of pages to display
  protected int TotalPages
  {
   get {return Convert.ToInt32(ViewState["TotalPages"]);}
   set {ViewState["TotalPages"] = value;}
  }
  // ***********************************************************************

  // ***********************************************************************
  // Fetches and stores the content
  public void GetContent()
  {
   // Controls must be recreated after content change
   ChildControlsCreated = false;

   string[] result=Regex.Split(SourceContent,@"/[page/]",RegexOptions.IgnoreCase);
   TotalPages = result.Length;

   bool isValidPage = (CurrentPageIndex >=0 && CurrentPageIndex <= TotalPages-1);
   // Prepares event data
   ContentChangedEventArgs es = new ContentChangedEventArgs();
   if (isValidPage) es.Content = result[CurrentPageIndex];
   else es.Content="";

   // Fires the content changed event
   OnSourceContentChanged(es);
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE Render
  // Writes the content to be rendered on the client
  protected override void Render(HtmlTextWriter output)
  {
   // If in design-mode ensure that child controls have been created.
   // Child controls are not created at this time in design-mode because
   // there's no pre-render stage. Do so for composite controls like this
   if (Site != null && Site.DesignMode)
    CreateChildControls();

   base.Render(output);
  }
  // ***********************************************************************

  // ***********************************************************************
  // OVERRIDE CreateChildControls
  // Outputs the HTML markup for the control
  protected override void CreateChildControls()
  {
   Controls.Clear();
   ClearChildViewState();

   BuildControlHierarchy();
  }
  // ***********************************************************************
  #endregion

  #region PRIVATE HELPER METHODS
  // ***********************************************************************
  // PRIVATE BuildControlHierarchy
  // Control the building of the control's hierarchy
  private void BuildControlHierarchy()
  {
   // Build the surrounding table (one row, two cells)
   Table t = new Table();
   t.Width = new Unit("100%");
   // Build the table row
   TableRow row = new TableRow();
   t.Rows.Add(row);

   // Build the cell with the page index
   TableCell cellPageDesc = new TableCell();
   cellPageDesc.HorizontalAlign = HorizontalAlign.Left;
   row.Cells.Add(cellPageDesc);

   // Build the cell with navigation bar
   TableCell cellNavBar = new TableCell();
   BuildNumericListUI(cellNavBar);
   row.Cells.Add(cellNavBar);

   // Add the table to the control tree
   Controls.Add(t);
  }
  // ***********************************************************************
    
  // ***********************************************************************
  private void BuildNumericListUI(TableCell cell)
  {
   bool isValidPage = (CurrentPageIndex >=0 && CurrentPageIndex <= TotalPages-1);
   bool canMoveBack = (CurrentPageIndex>0);
   bool canMoveForward = (CurrentPageIndex<TotalPages-1);

   // Render the < button
   LinkButton prev = new LinkButton();
   prev.ID = "Prev";
   prev.CausesValidation = false;
   prev.Click += new EventHandler(prev_Click);
   prev.Text = "Prev"; 
   prev.Enabled = isValidPage && canMoveBack;
   cell.Controls.Add(prev);

   // Add a separator
   cell.Controls.Add(new LiteralControl("&nbsp;"));

   for(int ix=0;ix<TotalPages;ix++)
   {
    LinkButton lbtn = new LinkButton();
    lbtn.ID = "lbtn_"+ix.ToString();
    lbtn.Click += new EventHandler(lbtn_Click);
    lbtn.CssClass = "content_cn_12px_b";
    if(ix==CurrentPageIndex)
    {
     lbtn.ForeColor = Color.Red;
     lbtn.Enabled = false;
    }
    else
    {
     lbtn.ForeColor = ForeColor;
     lbtn.Enabled = true;
    }
    //lbtn.ToolTip = "オレ"+(i+1).ToString()+"メウ";
    lbtn.Text = " " + (ix+1).ToString() + " ";
    lbtn.Style.Add("TEXT-DECORATION","none");
    
    cell.Controls.Add(lbtn);
   }

   // Render the > button
   LinkButton next = new LinkButton();
   next.ID = "Next";
   next.CausesValidation = false;
   next.Click += new EventHandler(next_Click);
   next.Text = " Next "; 
   next.Enabled = isValidPage && canMoveForward;
   cell.Controls.Add(next);
  }

  // ***********************************************************************
  // PRIVATE ValidatePageIndex
  // Ensures the CurrentPageIndex is either valid [0,TotalPages) or -1
  private void ValidatePageIndex()
  {
   if (!(CurrentPageIndex >=0 && CurrentPageIndex < TotalPages))
    CurrentPageIndex = -1;
   return;
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE GoToPage
  // Sets the current page index
  private void GoToPage(int pageIndex)
  {
   // Prepares event data
   PageChangedEventArgs e = new PageChangedEventArgs();
   e.OldPageIndex = CurrentPageIndex;
   e.NewPageIndex = pageIndex;
   
   // Updates the current index
   CurrentPageIndex = pageIndex;

   // Fires the page changed event
   OnPageIndexChanged(e);  
 
   //get current content
   GetContent();

  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE prev_Click
  // Event handler for the < button
  private void prev_Click(object sender, EventArgs e)
  {
   GoToPage(CurrentPageIndex-1);
  }
  // ***********************************************************************

  // ***********************************************************************
  private void lbtn_Click(object sender, EventArgs e)
  {
   CurrentPageIndex=int.Parse((sender as LinkButton).Text)-1;
   GoToPage(CurrentPageIndex);
  }
  // ***********************************************************************

  // ***********************************************************************
  // PRIVATE next_Click
  // Event handler for the > button
  private void next_Click(object sender, EventArgs e)
  {
   GoToPage(CurrentPageIndex+1);
  }
  // ***********************************************************************
  #endregion
 }
 #endregion
}
 

 

//

private void Page_Load(object sender, System.EventArgs e)
  {
   // ページを初期化するユーザー コードをここに挿入します。
   if (this.IsPostBack== false)
   {
    ContentPager1.SourceContent = "40分、ACCは123便と他機との交信を分けるため、123便専用の周波数が準備され、123便にその周波数に変える[page]よう求めたが返答は無かった。42分、123便 ... そして20時30分、関係機関は[page]山火事が確認された長野県南佐久郡近郊が123便の正式な墜落地点とした。";
    ContentPager1.CurrentPageIndex = 0;
    ContentPager1.GetContent();
   }

  }

private void ContentPager1_SourceContentChanged(object sender, JojoEmpire.ContentChangedEventArgs e)
  {
  TextBox1.Text = e.Content;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值