一个简单的分页控件,用来自定义分页用的

来源:互联网 发布:db2 查看数据库中的表 编辑:程序博客网 时间:2024/06/11 20:59
在做项目的过程中,最初采用Datagrid的默任的分页方式分页,后来发现对于大的数据量速度很慢,NET进程占用系统资源也很大,后来写了个分页的存储过程,每次取数据都只取当前页的,分页是分好了,但是发现翻页就没那么方便了,于是自己写了个简单的分页控件,代码如下(编译以后直接形成dll就可以用)。
程序代码:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace PageInfoControl
{
 /// <summary>
 /// WebCustomControl1 的摘要说明。
 /// </summary>
 [DefaultProperty("TotalRecord"),
  ToolboxData("<{0}:PageInfo runat=server></{0}:PageInfo>")]
 public class PageInfo : System.Web.UI.WebControls.WebControl,IPostBackEventHandler
 {
  #region Construct method
  /// <summary>
  /// 构造函数
  /// </summary>
  public PageInfo():base(HtmlTextWriterTag.Div)
  {

  }
  #endregion

  #region Variables and Constants
  
  public event EventHandler ChangePageClick;
  private string _BarBackGroundColor = "#F1F1F1";
  private string _BarLinkColor  = "Navy";
  private string _BarCurrentColor  = "#EEEEEE";
  private int    _TotalRecord   = 0;
  private int    _TotalPage   = 0;
  private int    _PageSize   = 0;
  private int    _CurrentPageIndex = 1;
  private int    _ItemSize   = 10;

  #endregion

  #region Properties

  [
  Description("分页条背景色"),
  Bindable(true),
  Category("Appearance"),
  DefaultValue("#F1F1F1")
  ]
  public string BarBackGroundColor
  {
   get{return _BarBackGroundColor;}
   set{_BarBackGroundColor = value;}
  }

  [
  Description("分页条带链接数字颜色"),
  Bindable(true),
  Category("Appearance"),
  DefaultValue("Navy")
  ]
  public string BarLinkColor
  {
   get{return _BarLinkColor;}
   set{_BarLinkColor = value;}
  }

  [
  Description("分页条当前页数字颜色"),
  Bindable(true),
  Category("Appearance"),
  DefaultValue("#EEEEEE")
  ]
  public string BarCurrentColor
  {
   get{return _BarCurrentColor;}
   set{_BarCurrentColor = value;}
  }

  [
  Description("总记录数"),
  Bindable(false),
  Category("Behavior"),
  DefaultValue(0)
  ]
  public int TotalRecord
  {
   get{return _TotalRecord;}
   set
   {
    foreach(char c in System.Convert.ToString(value)) 
    { 
     if (!Char.IsNumber(c)) 
     { 
      _TotalRecord = 0;
      break;
     } 
    } 
    _TotalRecord = value;
   }
  }

  [
  Description("每页显示记录数"),
  Bindable(true),
  Category("Behavior"),
  DefaultValue(0)
  ]
  public int PageSize
  {
   get{return _PageSize;}
   set
   {
    foreach(char c in System.Convert.ToString(value)) 
    { 
     if (!Char.IsNumber(c)) 
     { 
      _PageSize = 0;
      break;
     } 
    } 
    _PageSize = value;
   }
  }

  [
  Description("总页数"),
  Bindable(true),
  Category("Behavior"),
  DefaultValue(0)
  ]
  public int TotalPage
  {
   get{return _TotalPage;}
  }

  [
  Description("数字规格"),
  Bindable(true),
  Category("Behavior"),
  DefaultValue(10)
  ]
  public int ItemSize
  {
   get{return _ItemSize;}
   set
   {
    foreach(char c in System.Convert.ToString(value)) 
    { 
     if (!Char.IsNumber(c)) 
     { 
      _ItemSize = 10;
      break;
     } 
    } 
    _ItemSize = value;
   }
  }

  [
  Description("当前页值"),
  Bindable(true),
  Category("Behavior"),
  DefaultValue(1)
  ]
  public int CurrentPageIndex
  {
   get{return _CurrentPageIndex;}
   set{_CurrentPageIndex = value;}
  }


  #endregion

  //定义Div的样式
  protected override void AddAttributesToRender(HtmlTextWriter writer)
  {
   writer.AddStyleAttribute("White-space","nowrap");
   writer.AddStyleAttribute("Padding-Top","2px");
   writer.AddStyleAttribute("Padding-Bottom","2px");
   writer.AddStyleAttribute("Width",Width.ToString());
   writer.AddStyleAttribute("Height",Height.ToString());
   base.AddAttributesToRender (writer);
  }

  protected virtual void OnPageChangeClick(EventArgs e)
  {
   if (ChangePageClick != null) 
   {
    ChangePageClick(this, e);
   }
  }

  public void RaisePostBackEvent(string eventArgument)
  {
   int PageIndex   = int.Parse(eventArgument);
   this._CurrentPageIndex = PageIndex;
   OnPageChangeClick(new EventArgs());
  }

  /// <summary>
  /// 将此控件呈现给指定的输出参数。
  /// </summary>
  /// <param name="output"> 要写出到的 HTML 编写器 </param>
  protected override void RenderContents(HtmlTextWriter output)
  {
   this._TotalPage   = ((this.TotalRecord / PageSize) * this.PageSize == this.TotalRecord)?(this.TotalRecord / this.PageSize):((this.TotalRecord / this.PageSize) + 1);
   int BeginRecord   = (this.CurrentPageIndex - 1) * this.PageSize + 1;
   int EndRecord   = this.CurrentPageIndex * this.PageSize;
   EndRecord    = (EndRecord>this.TotalRecord)?this.TotalRecord:EndRecord;
   string PageInfo   = "[共<font color=#CC0000>"+this.TotalPage.ToString()+"</font>页/当前第<font color=#CC0000>"+this.CurrentPageIndex.ToString()+"</font>页   共<font color=#CC0000>"+TotalRecord.ToString()+"</font>条记录,当前记录数<font color=#CC0000>"+BeginRecord.ToString()+"</font>到<font color=#CC0000>"+EndRecord.ToString()+"</font>]";
   string PageListStr  = "";
   string PageIndexColor = "#0000C0";
   int SingleNumber  = this.TotalPage - (TotalPage/ItemSize) * ItemSize; //得到分页后的尾数(比如:总共58页,按10页规格显示,则尾数为8)
   int IntPageForMax  = (this.CurrentPageIndex - 1) / ItemSize;
   int MinInt    = (1 + ItemSize * IntPageForMax);
   int MaxInt    = ((IntPageForMax + 1) * ItemSize)>TotalPage?TotalPage:((IntPageForMax + 1) * ItemSize);
   if(this.TotalRecord == 0 || this.TotalPage == 0)
   {
    PageListStr  = "<font color="+PageIndexColor+">0</font>";
    PageListStr  = PageListStr + " [共<font color=#CC0000>0</font>页/当前第<font color=#CC0000>0</font>页   共<font color=#CC0000>0</font>条记录,当前记录数<font color=#CC0000>0</font>到<font color=#CC0000>0</font>]";
    output.Write(PageListStr);
   }
   else
   {
    if(this.TotalPage <= this.ItemSize)
    {
     for(int i = 1;i <= TotalPage;i++)
     {
      PageIndexColor = CurrentPageIndex==i?"#CC0000":"#0000C0";
      if(CurrentPageIndex == i)
       PageListStr  = PageListStr + " <a title='当前为第『"+i+"』页' href='#' id=/"" + this.UniqueID + "/"><font color="+PageIndexColor+">"+i.ToString()+"</font></a>";
      else
       PageListStr  = PageListStr + " <a title='点击转到第『"+i+"』页' id=/"" + this.UniqueID + "/" href=/"javascript:" + Page.GetPostBackEventReference(this,i.ToString()) +"/"><font color="+PageIndexColor+">"+i.ToString()+"</font></a>";
     }
     PageListStr  = PageListStr ==""?"<font color="+PageIndexColor+">0</font>":PageListStr;
     PageListStr  = PageListStr + " "+PageInfo;
     output.Write(PageListStr);
    }
    else
    {
     for(int i = MinInt;i <= MaxInt;i++)
     {
      PageIndexColor  = CurrentPageIndex==i?"#CC0000":"#0000C0";
      if(CurrentPageIndex == i)
       PageListStr  = PageListStr + " <a title='当前为第『"+i+"』页' href='#' id=/"" + this.UniqueID + "/"><font color="+PageIndexColor+">"+i.ToString()+"</font></a>";
      else
       PageListStr  = PageListStr + " <a title='点击转到第『"+i+"』页' id=/"" + this.UniqueID + "/" href=/"javascript:" + Page.GetPostBackEventReference(this,i.ToString()) +"/"><font color="+PageIndexColor+">"+i.ToString()+"</font></a>";
     }
     //当当前页数小于ItemSize且总的页数大于ItemSize时 
     if(CurrentPageIndex <= ItemSize && TotalPage > ItemSize)
     {
      PageListStr = PageListStr + " <a id=/"" + this.UniqueID + "/" title='点击转到第『"+System.Convert.ToString(ItemSize + 1)+"』页' href=/"javascript:" + Page.GetPostBackEventReference(this,System.Convert.ToString(ItemSize + 1)) +"/">>></a>";
     }
     //当当前页数大于ItemSize,且总的页数减去当前页数大于等于尾数值页数时
     if(this.CurrentPageIndex > ItemSize && (TotalPage - this.CurrentPageIndex) >= SingleNumber)
     {
      int MultiMinPageIndex = (IntPageForMax * ItemSize);
      int MultiMaxPageIndex = ((IntPageForMax+1) * ItemSize) + 1;
      PageListStr = "<a id=/"" + this.UniqueID + "/" title='点击转到第『"+MultiMinPageIndex+"』页' href=/"javascript:" + Page.GetPostBackEventReference(this,MultiMinPageIndex.ToString()) +"/"><<</a>" + PageListStr.Trim() + "<a id=/"" + this.UniqueID + "/" title='点击转到第『"+MultiMaxPageIndex+"』页' href=/"javascript:" + Page.GetPostBackEventReference(this,MultiMaxPageIndex.ToString()) +"/">>></a>";
     }
     //当当前页数大于ItemSize,且总的页数减去当前页数大于等于尾数值页数时
     if(CurrentPageIndex > 10 && (TotalPage - CurrentPageIndex) < SingleNumber)
     {
      int MultiMinPageIndex = (IntPageForMax * ItemSize);
      PageListStr = "<a id=/"" + this.UniqueID + "/" title='点击转到第『"+MultiMinPageIndex+"』页' href=/"javascript:" + Page.GetPostBackEventReference(this,MultiMinPageIndex.ToString()) +"/"><<</a>" + PageListStr.Trim();
     }

     PageListStr  = PageListStr ==""?"<font color="+PageIndexColor+">0</font>":PageListStr;
     PageListStr  = PageListStr + " "+PageInfo;
     output.Write(PageListStr);
    }
   }
   base.RenderContents(output);
  }
 }
}


控件中有几个相关的属性,在使用的时候,只需要指定:TotalRecord(总记录数)、PageSize(每页的数据记录数)、CurrentPageIndex(当前页面值)、ItemSize(分页条显示页面值的规格)
控件中有个ChangePageClick事件,可以利用“控件ID.CurrentPageIndex”属性来获取当前页面值。
 
原创粉丝点击