自制内容分页控件

    技术2022-05-11  56

    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(" "));

       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;  }


    最新回复(0)