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