改进型分页控件,用于 DataGrid,DataList,Repeater 控件分页操作

using System;
using System.Collections;
using System.Text;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.WebControls;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;

namespace AspxPager
{
 /// <summary>
 /// /*
 ///函数名称: GetRecordFromPage
 ///函数功能: 获取指定页的数据
 ///参数说明:
 ///@tblName       包含数据的表名
 ///@PKName       关键字段名
 ///@strGotFields 要获取的字段
 ///@PageSize      每页记录数
 ///@PageIndex     要获取的页码
 ///@OrderType     排序类型, 0 - 升序, 1 - 降序
 ///@strWhere      查询条件 (注意: 不要加 where)
 ///@isCount   是否取得记录条数 , 0 - 不取 , 1 - 获取
 ///@strSort  排序字段
 ///*/
 ///*
 /// 函数名称: GetRecordFromPage
 /// 函数功能: 获取指定页的数据
 /// 参数说明:
 /// @tblName       包含数据的表名
 /// @PKName       关键字段名
 /// @strGotFields 要获取的字段
 /// @PageSize      每页记录数
 /// @PageIndex     要获取的页码
 /// @OrderType     排序类型, 0 - 升序, 1 - 降序
 /// @strWhere      查询条件 (注意: 不要加 where)
 /// @isCount 是否取得记录条数 , 0 - 不取 , 1 - 获取
 /// @strSort 排序字段
 /// */
 /// CREATE PROCEDURE GetRecordFromPage
 /// @tblName      varchar(2000),        -- 表名
 /// @PKName      varchar(255),        -- 字段名
 /// @strGotFields varchar(1000) = '*' ,  --查询字段名
 /// @PageSize     int = 10,             -- 页尺寸
 /// @PageIndex    int = 1,              -- 页码
 /// @OrderType    bit = 0,              -- 设置排序类型, 非 0 值则降序
 /// @strWhere     varchar(2000) = '' ,  -- 查询条件 (注意: 不要加 where)
 /// @isCount bit = 1,   --取得记录条数
 /// @strSort varchar(255) = ''  --排序字段
 /// --@GroupBy      varchar(2000) ='' --分组字段
 /// AS
 /// declare @strSQL   varchar(6000)       -- 主语句
 /// declare @strTmp   varchar(2000)        -- 临时变量
 /// declare @strOrder varchar(500)          -- 排序类型
 /// declare @strCount varchar(2000)
 /// declare @fldName varchar(500)
 /// declare @sortName varchar(255)
 /// declare @countSQL varchar(2000)
 ///
 /// set @fldName = @PKName
 /// if @strSort != ''
 /// begin
 /// set @sortName = @strSort
 /// end
 /// else
 /// begin
 /// set @sortName = @PKName
 /// end
 ///
 /// if @strWhere<>''
 /// Set @strWhere = Replace(@strWhere,'''''','''')
 ///
 /// Set @tblName = Replace(@tblName,'''''','''')
 ///
 /// print @tblName
 /// if @isCount = 1
 /// begin
 /// if @strWhere != ''
 /// begin
 /// set @countSQL = 'select count(' + @fldName + ') from ' + @tblName  + ' where ' + @strWhere
 /// end
 /// else
 /// begin
 /// set @countSQL = 'select count(' + @fldName + ') from ' + @tblName
 /// end
 /// --set @countSQL = @countSQL + ' ' + @GroupBy 
 /// print @countSQL
 /// exec (@countSQL)
 /// return
 /// end
 /// else
 /// begin
 ///
 /// if @OrderType != 0
 /// begin
 /// set @strTmp = '<(select min'
 /// set @strOrder = ' order by ' + @sortName + ' desc'
 /// end
 /// else
 /// begin
 /// set @strTmp = '>(select max'
 /// set @strOrder = ' order by ' + @sortName +' asc'
 /// end
 ///
 /// set @strSQL = 'select top ' + str(@PageSize) + ' '+ @strGotFields + '  from '
 /// + @tblName + ' where ' + @fldName + '' + @strTmp + '('
 /// + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
 /// + @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'
 /// + @strOrder
 ///
 /// if @strWhere != ''
 /// set @strSQL = 'select top ' + str(@PageSize) + ' '+ @strGotFields + '  from '
 /// + @tblName + ' where ' + @fldName + '' + @strTmp + '('
 /// + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
 /// + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
 /// + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
 ///
 /// if @PageIndex = 0
 /// Set @PageIndex = 1
 ///
 /// if @PageIndex = 1
 /// begin
 /// set @strTmp = ''
 /// if @strWhere != ''
 /// set @strTmp = ' where (' + @strWhere + ')'
 ///
 /// set @strSQL = 'select top ' + str(@PageSize) + @strGotFields + '  from '
 /// + @tblName + '' + @strTmp + ' ' + @strOrder
 /// end
 /// </summary>
 [DesignerAttribute("AspxPager.CusPageCtrlDesign, AspxPager")]
 [ToolboxData("<{0}:DataPager runat=server></{0}:DataPager>")]
 public class DataPager : System.Web.UI.Control,IPostBackDataHandler, IPostBackEventHandler
 {
  private int  _PageCount;
  private string  _TableName;
  private string  _SelectFields;
  private string  _SortField;
  private int  _CurPageIndex = 0;
  private string  _btDCtrl;
  private string  _SelectWhere;
  private string  _DataKeyField;
  private int  _itemCount;
  private int  _NumericPages = 10;
  private int     _PageSize   = 20;
  private int     _ItemsCount;
  private DataPager.PagerStyle _PageStyle = DataPager.PagerStyle.NextPrev;
  private DataPager.OrderType  itype;
  private Control DataControl;
  private string ControlType;
  private string _FirstStr = "首页";
  private string _PrevStr  = "上页";
  private string _NextStr  = "下页";
  private string _EndStr = "末页";
  private string _GoStr = "GO";
  private string _GoButtonCss;
  private string _NextPrevEnableCss;
  private string _NextPrevDisableCss;
  private string _NextPrevTextBoxCss;
  private string _NumericCurrentPagesCss;
  private string _NumericPagesCss;
  private string _NumericFormatString;
  private string _NumericSeparator;
  private string _TotalItemsFormatString;
  private string _TotalPagesFormatString;
  private string _TotalCurPageFormatString;
  private string _AppSettingsKey;
  private string ConnectionString;
  private bool _EnableGo = true;
  private string  _Width;
  private DataPager.HorizontalAlign _HzAlign;
  private int _IndexNumCell = -1;

  private DataView _datasource;

  /// <summary>
  /// 水平对齐方式
  /// </summary>
  public enum HorizontalAlign
  {
   Left = 0,
   Center = 1,
   Right = 2
  }
  /// <summary>
  /// 排序
  /// </summary>
  public enum OrderType
  {
   Asc  = 0,
   Desc = 1
  }
  /// <summary>
  /// 分页样式
  /// </summary>
  public enum PagerStyle
  {
   /// <summary>
   /// 自定义
   /// </summary>
   Customer  = 0,
   /// <summary>
   /// 上下页
   /// </summary>
   NextPrev  = 1,
   /// <summary>
   /// 数字序号
   /// </summary>
   NumericPages = 2
  }
  #region 属性
  /// <summary>
  /// DataGrid 中索引列
  /// </summary>
  [Bindable(true),Category("DataGrid 样式"),DefaultValue("Server"),Description("DataGrid 中索引列")]
  public int IndexNumCell
  {
   get{ return _IndexNumCell; }
   set{ _IndexNumCell = value;}
  }
  /// <summary>
  /// 数据库连接字符串 appSettings 节点
  /// </summary>
  [Bindable(true),Category("数据库"),DefaultValue("Server"),Description("Web.Config 中 数据库连接字符串 appSettings 节点")]
  public string AppSettingsKey
  {
   get
   {
    return _AppSettingsKey;
   }
   set
   {
    _AppSettingsKey = value;
    ConnectionString = System.Configuration.ConfigurationSettings.AppSettings[_AppSettingsKey];
   }
  }  
  /// <summary>
  /// 格式化记录总数字符串
  /// </summary>
  [Bindable(true),Category("分页信息"),DefaultValue("共 {0} 记录"),Description("格式化记录总数字符串")]
  public string TotalItemsFormatString
  {
   get{ return _TotalItemsFormatString; }
   set{ _TotalItemsFormatString = value;}
  }
  /// <summary>
  /// 格式化记录总数字符串
  /// </summary>
  [Bindable(true),Category("分页信息"),DefaultValue("共 {0} 页"),Description("格式化记录分页数字符串")]
  public string TotalPagesFormatString
  {
   get{ return _TotalPagesFormatString; }
   set{ _TotalPagesFormatString = value;}
  }
  /// <summary>
  /// 格式化记录总数字符串
  /// </summary>
  [Bindable(true),Category("分页信息"),DefaultValue("当前第 {0} 页"),Description("格式化当前分页字符串")]
  public string TotalCurPageFormatString
  {
   get{ return _TotalCurPageFormatString; }
   set{ _TotalCurPageFormatString = value;}
  }
  /// <summary>
  /// 跳转页码功能是否可用
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("跳转页码功能是否可用")]
  public bool EnableGoVoid
  {
   get{ return _EnableGo; }
   set{ _EnableGo = value;}
  }
  /// <summary>
  /// 跳转页码输入框样式
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("跳转页码输入框样式")]
  public string NextPrevTextBoxCss
  {
   get{ return _NextPrevTextBoxCss; }
   set{ _NextPrevTextBoxCss = value;}
  }
  /// <summary>
  /// 跳转按钮文字
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("跳转按钮文字")]
  public string GoStr
  {
   get{ return _GoStr; }
   set{ _GoStr = value;}
  }
  /// <summary>
  /// 跳转按钮Css样式
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("跳转按钮Css样式")]
  public string GoButtonCss
  {
   get{ return _GoButtonCss; }
   set{ _GoButtonCss = value;}
  }
  /// <summary>
  /// 上下页可用按钮Css样式
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("上下页可用按钮Css样式")]
  public string NextPrevEnableCss
  {
   get{ return _NextPrevEnableCss; }
   set{ _NextPrevEnableCss = value;}
  }
  /// <summary>
  /// 上下页不可用按钮Css样式
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("上下页不可用按钮Css样式")]
  public string NextPrevDisableCss
  {
   get{ return _NextPrevDisableCss; }
   set{ _NextPrevDisableCss = value;}
  }
  /// <summary>
  /// 首页文字
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("首页文字")]
  public string FirstStr
  {
   get{ return _FirstStr; }
   set{ _FirstStr = value;}
  }
  /// <summary>
  /// 上一页文字
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("上一页文字")]
  public string PrevStr
  {
   get{ return _PrevStr; }
   set{ _PrevStr = value;}
  }
  /// <summary>
  /// 下一页文字
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("下一页文字")]
  public string NextStr
  {
   get{ return _NextStr; }
   set{ _NextStr = value;}
  }
  /// <summary>
  /// 末页文字
  /// </summary>
  [Bindable(true),Category("上下页分页样式"),DefaultValue(""),Description("末页文字")]
  public string EndStr
  {
   get{ return _EndStr; }
   set{ _EndStr = value;}
  }
  /// <summary>
  /// 当前所在分页Css样式
  /// </summary>
  [Bindable(true),Category("NumericPages"),DefaultValue(""),Description("当前所在分页Css样式")]
  public string NumericCurrentPagesCss
  {
   get{ return _NumericCurrentPagesCss; }
   set{ _NumericCurrentPagesCss = value;}
  }
  /// <summary>
  /// 分页Css样式
  /// </summary>
  [Bindable(true),Category("NumericPages"),DefaultValue(""),Description("分页Css样式")]
  public string NumericPagesCss
  {
   get{ return _NumericPagesCss; }
   set{ _NumericPagesCss = value;}
  }
  /// <summary>
  /// 分页样式为:NumericPages 时,数字序号长度
  /// </summary>
  [Bindable(true),Category("NumericPages"),DefaultValue(""),Description("分页样式为:NumericPages 时,数字序号长度")]
  public int NumericPages
  {
   get{ return _NumericPages; }
   set{ _NumericPages = value;}
  }
  /// <summary>
  /// 页码分隔符
  /// </summary>
  [Bindable(true),Category("NumericPages"),DefaultValue("|"),Description("页码分隔符")]
  public string NumericSeparator
  {
   get{ return _NumericSeparator; }
   set{ _NumericSeparator = value;}
  }
  /// <summary>
  /// 格式化分页页码字符串
  /// </summary>
  [Bindable(true),Category("NumericPages"),DefaultValue(""),Description("格式化分页页码字符串")]
  public string NumericFormatString
  {
   get{ return _NumericFormatString; }
   set{ _NumericFormatString = value;}
  }


  /// <summary>
  /// 数据记录条数
  /// </summary>
  public int ItemsCount
  {
   get{ return _ItemsCount; }
  }
  /// <summary>
  /// 分页样式
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("分页样式")]
  public DataPager.PagerStyle PageStyle
  {
   get{ return _PageStyle; }
   set{ _PageStyle = value;}
  }
  /// <summary>
  /// 排序方式
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("排序方式")]
  public DataPager.OrderType Order
  {
   get{ return itype; }
   set{ itype = value;}
  }
  /// <summary>
  /// 分页数
  /// </summary>
  public int PageCount
  {
   get{ return _PageCount; }
  }
  /// <summary>
  /// 关键字段
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("关键字段")]
  public string KeyField
  {
   get{ return _DataKeyField; }
   set{ _DataKeyField = value;}
  }
  /// <summary>
  /// 杳询条件
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("查询条件")]
  public string SelectWhere
  {
   get{ return _SelectWhere; }
   set{ _SelectWhere = value; }
  }
  /// <summary>
  /// 要绑定的数据控件
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("要绑定的数据控件 ID 值:DataGrid,DataList,Repeater")]
  public string BindToDataControl
  {
   get{ return _btDCtrl;  }
   set{ _btDCtrl = value; }
  }
  /// <summary>
  /// 当前页码索引
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("当前页码索引")]
  public int CurPageIndex
  {
   get{ return _CurPageIndex;  }
   set{ _CurPageIndex = value; }
  }
  /// <summary>
  /// 排序字段
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("排序字段")]
  public string SortField
  {
   get{ return _SortField; }
   set{ _SortField = value;}
  }
  /// <summary>
  /// 分页记录条数
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue("25"),Description("分页记录条数")]
  public int PageSize
  {
   get{ return _PageSize; }
   set{ _PageSize = value; }
  }
  /// <summary>
  /// 查询数据来源表格
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("数据表")]
  public string SelectTableName
  {
   get{ return _TableName; }
   set{ _TableName = value;}
  }
  /// <summary>
  /// 查询字段
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("从数据表中读取出来的字段")]
  public string SelectFields
  {
   get{ return _SelectFields; }
   set{ _SelectFields = value; }
  }
  /// <summary>
  /// 水平对齐方式
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue("100%"),Description("水平对齐方式")]
  public DataPager.HorizontalAlign Align
  {
   get{ return _HzAlign; }
   set{ _HzAlign = value;}
  }
  /// <summary>
  /// 控件宽度
  /// </summary>
  [Bindable(true),Category("Appearance"),DefaultValue(""),Description("宽度")]
  public string Width
  {
   get{ return _Width; }
   set{ _Width = value;}
  }
  #endregion

  #region 控件内部规范
  protected override object SaveViewState()
  {   
   ArrayList ary = new ArrayList();
   ary.Add("");      //0
   ary.Add(this.BindToDataControl); //1
   ary.Add(this.CurPageIndex);   //2
   ary.Add(this.KeyField);    //3
   ary.Add(this.PageCount);   //4
   ary.Add(this.PageSize);    //5
   ary.Add(this.SelectFields);   //6
   ary.Add(this.SelectWhere);   //7
   ary.Add(this.SortField);   //8
   ary.Add(this.SelectTableName);  //9 
   ary.Add(this.NumericPages);   //10
   ary.Add((int)this.Order);   //11
   ary.Add((int)this.PageStyle);  //12
   ary.Add(ItemsCount);    //13
   ary.Add(this.FirstStr);    //14
   ary.Add(this.PrevStr);    //15
   ary.Add(this.NextStr);    //16
   ary.Add(this.EndStr);    //17
   ary.Add(this.GoStr);    //18
   ary.Add(this.NextPrevDisableCss); //19
   ary.Add(this.NextPrevEnableCss); //20 
   ary.Add(this.NextPrevTextBoxCss); //21
   ary.Add(this.NumericCurrentPagesCss);//22
   ary.Add(this.NumericFormatString); //23
   ary.Add(this.NumericPagesCss);  //24
   ary.Add(this.NumericSeparator);  //25
   ary.Add(this.TotalCurPageFormatString); //26
   ary.Add(this.TotalItemsFormatString); //27
   ary.Add(this.TotalPagesFormatString); //28
   ary.Add(this.EnableGoVoid);    //29
   ary.Add(this.AppSettingsKey);   //30
   ary.Add(this.IndexNumCell);    //31
   return (object)ary;
  }

  protected override void LoadViewState(object savedState)
  {
   ArrayList ary = (ArrayList)savedState;
   this.BindToDataControl  = ary[1].ToString();
   this.CurPageIndex  = Convert.ToInt32(ary[2]);
   this.KeyField   = ary[3].ToString();
   //this.PageCount   = Convert.ToInt32(ary[4]);
   //System.Web.HttpContext.Current.Response.Write(ary[5].ToString());
   this.PageSize   = Convert.ToInt32(ary[5]);
   this.SelectFields  = ary[6].ToString();
   if(ary[7] != null)
   {
    this.SelectWhere  = ary[7].ToString();
   }
   if(ary[8] != null)
   {
    this.SortField   = ary[8].ToString();
   }
   this.SelectTableName = ary[9].ToString();
   this.NumericPages  = Convert.ToInt32(ary[10]);
   this.Order    = (DataPager.OrderType)Convert.ToInt32(ary[11]);
   this.PageStyle   = (DataPager.PagerStyle)Convert.ToInt32(ary[12]);
   this._ItemsCount  = Convert.ToInt32(ary[13]);   
   if(ary[14] != null)
   {
    this.FirstStr   = ary[14].ToString();
   }
   if(ary[15] != null)
   {
    this.PrevStr   = ary[15].ToString();
   }
   if(ary[16] != null)
   {
    this.NextStr   = ary[16].ToString();
   }
   if(ary[17] != null)
   {
    this.EndStr    = ary[17].ToString();
   }
   if(ary[18] != null)
   {
    this.GoStr    = ary[18].ToString();
   }
   if(ary[19] != null)
   {
    this.NextPrevDisableCss = ary[19].ToString();
   }
   if(ary[20] != null)
   {
    this.NextPrevEnableCss = ary[20].ToString();
   }
   if(ary[21] != null)
   {
    this.NextPrevTextBoxCss = ary[21].ToString();
   }
   if(ary[22] != null)
   {
    this.NumericCurrentPagesCss = ary[22].ToString();
   }
   if(ary[23] != null)
   {
    this.NumericFormatString = ary[23].ToString();
   }
   if(ary[24] != null)
   {
    this.NumericPagesCss  = ary[24].ToString();
   }
   if(ary[25] != null)
   {
    this.NumericSeparator  = ary[25].ToString();
   }
   if(ary[26] != null)
   {
    this.TotalCurPageFormatString = ary[26].ToString();
   }
   if(ary[28] != null)
   {
    this.TotalPagesFormatString  = ary[28].ToString();
   }
   if(ary[27] != null)
   {
    this.TotalItemsFormatString  = ary[27].ToString();   
   }
   this.EnableGoVoid  = Convert.ToBoolean(ary[29]);
   this.AppSettingsKey  = ary[30].ToString();
   this.IndexNumCell  = Convert.ToInt32(ary[31]);
  }

  public bool LoadPostData(string postDataKey, NameValueCollection values)
  {

   this.CurPageIndex = Int32.Parse(values[this.UniqueID]);
   return false;
  }

  public void RaisePostDataChangedEvent()
  {

   // IPostBackDataHandler 协定的一部分。如果曾经从 LoadPostData 方法返回真
   // (表示需要引发更改通知),则被调用。由于
   // 始终返回假,则此方法只是一个空操作。
  }
  public void RaisePostBackEvent(string eventArgument)
  {
   //this.CurPageIndex = Convert.ToInt32(eventArgument);
   GetDataSource();
  }
  protected override void OnInit(EventArgs e)
  {
   DataControl = this.Parent.FindControl(this.BindToDataControl);
   this.ControlType = DataControl.GetType().ToString();
   if(ControlType == "System.Web.UI.WebControls.DataGrid")
   {
    DataGrid dGrid = (DataGrid)DataControl;
    dGrid.SortCommand += new DataGridSortCommandEventHandler(DataGrid_SortCommand);
    dGrid.ItemDataBound += new DataGridItemEventHandler(DataGrid_ItemDataBound);
   }
  }
  protected override void OnLoad(EventArgs e)
  {
   this.DataBind();
  }
  public override void DataBind()
  {   
   GetDataSourcePageCount();
   this.GetDataSource();
   base.DataBind ();
  }
  protected override void Render(HtmlTextWriter output)
  {
   output.Write("<input type=/"hidden/" name=" + this.UniqueID + " type=text value=" + this.CurPageIndex + ">");
   if(this.Width != null)
   {
    output.Write("<table width=/"" + this.Width + "/">");    
   }
   else
   {
    output.Write("<table>");    
   }
   output.Write("<tr valign=/"middle/">");
   output.Write("<td align=/"left/">");
   if(this.TotalItemsFormatString != null)
   {
//    System.Web.HttpContext.Current.Response.Write(TotalItemsFormatString + "<br>");
//    System.Web.HttpContext.Current.Response.Write(TotalCurPageFormatString + "<br>");
//    System.Web.HttpContext.Current.Response.Write(TotalPagesFormatString + "<br>");
    output.Write(String.Format(TotalItemsFormatString,this._itemCount) + "&nbsp;");
   }
   if(this.TotalCurPageFormatString != null)
   {
    output.Write(String.Format(TotalCurPageFormatString,(this.CurPageIndex + 1)) + "&nbsp;");
   }
   if(this.TotalPagesFormatString != null)
   {
    output.Write(String.Format(TotalPagesFormatString,this.PageCount) + "&nbsp;");
   }
   output.Write("</td>");
   output.Write("<td align=/"right/">");
   if(this.PageStyle == DataPager.PagerStyle.NumericPages)
   {
    output.Write(this.NumericPageString());
   }
   else if(this.PageStyle == DataPager.PagerStyle.NextPrev)
   {
    output.Write(this.NextPrevString());
   }
   output.Write("</td>");
   output.Write("</tr>");
   output.Write("</table>");
  }
  #endregion

  #region 私有方法
  /// <summary>
  /// 取得页码数
  /// </summary>
  private void GetDataSourcePageCount()
  {
   try
   {
    SqlParameter[] arParams = new SqlParameter[9];
    arParams[0] = new SqlParameter("@tblName",SqlDbType.VarChar,2000);
    arParams[0].Value = this.SelectTableName;
    arParams[1] = new SqlParameter("@strGotFields",SqlDbType.VarChar,1000);
    arParams[1].Value = this.SelectFields;
    arParams[2] = new SqlParameter("@strSort",SqlDbType.VarChar,200);
    arParams[2].Value = this.SortField;
    arParams[3] = new SqlParameter("@OrderType",SqlDbType.Bit);
    arParams[3].Value = false;
    arParams[4] = new SqlParameter("@PageSize",SqlDbType.Int);
    arParams[4].Value = this.PageSize;
    arParams[5] = new SqlParameter("@PageIndex",SqlDbType.Int);
    arParams[5].Value = this.CurPageIndex + 1;
    arParams[6] = new SqlParameter("@strWhere",SqlDbType.VarChar,2000);
    arParams[6].Value = this.SelectWhere;
    arParams[7] = new SqlParameter("@isCount",SqlDbType.Bit);
    arParams[7].Value = true;
    arParams[8] = new SqlParameter("@PKName",SqlDbType.VarChar,200);
    arParams[8].Value = this.KeyField;
    SqlConnection SqlCon = new SqlConnection(this.ConnectionString);
    SqlCon.Open();
    SqlCommand DataCmd = new SqlCommand();
    DataCmd.Connection = SqlCon;
    DataCmd.CommandType = CommandType.StoredProcedure;
    DataCmd.CommandText = "GetRecordFromPage";    
    for(int i=0;i<9;i++)
    {
     DataCmd.Parameters.Add(arParams[i]);
    }
    _itemCount = Convert.ToInt32(DataCmd.ExecuteScalar().ToString());
    SqlCon.Close();
    this._PageCount = Convert.ToInt32(Math.Ceiling( Convert.ToDouble(_itemCount) / Convert.ToDouble(this.PageSize)));
   }
   catch(Exception ex)
   {
    Page.Response.Write("PageCount Error:" + ex.Message);
   }
   //Page.Response.Write(ViewState["CurPageCount"].ToString());
  }

  
  /// <summary>
  /// 设置数据
  /// </summary>
  private void GetDataSource()
  {
   try
   {
    bool tmp = true;   
    DataSet ds = new DataSet();
    if(itype == OrderType.Desc)
    {
     tmp = false;
    }
    SqlParameter[] arParams = new SqlParameter[9];
    arParams[0] = new SqlParameter("@tblName",SqlDbType.VarChar,2000);
    arParams[0].Value = this.SelectTableName;
    arParams[1] = new SqlParameter("@strGotFields",SqlDbType.VarChar,1000);
    arParams[1].Value = this.SelectFields;
    arParams[2] = new SqlParameter("@strSort",SqlDbType.VarChar,200);
    arParams[2].Value = this.SortField;
    arParams[3] = new SqlParameter("@OrderType",SqlDbType.Bit);
    arParams[3].Value = tmp;
    arParams[4] = new SqlParameter("@PageSize",SqlDbType.Int);
    arParams[4].Value = this.PageSize;
    arParams[5] = new SqlParameter("@PageIndex",SqlDbType.Int);
    arParams[5].Value = this.CurPageIndex + 1;
    arParams[6] = new SqlParameter("@strWhere",SqlDbType.VarChar,2000);
    arParams[6].Value = this.SelectWhere;
    arParams[7] = new SqlParameter("@isCount",SqlDbType.Bit);
    arParams[7].Value = false;
    arParams[8] = new SqlParameter("@PKName",SqlDbType.VarChar,200);
    arParams[8].Value = this.KeyField;
    SqlConnection SqlCon = new SqlConnection(this.ConnectionString);
    SqlCon.Open();
    SqlCommand DataCmd = new SqlCommand();
    DataCmd.Connection = SqlCon;
    DataCmd.CommandType = CommandType.StoredProcedure;
    DataCmd.CommandText = "GetRecordFromPage"; 
    for(int i=0;i<9;i++)
    {
     DataCmd.Parameters.Add(arParams[i]);
    }
    SqlDataAdapter DataAdapter = new SqlDataAdapter();
    DataAdapter.SelectCommand = DataCmd;    
    DataAdapter.Fill(ds);
    SqlCon.Close();
    this._datasource = ds.Tables[0].DefaultView;
    
    if(ControlType == "System.Web.UI.WebControls.DataGrid")
    {
     DataGrid dGrid = (DataGrid)DataControl;
     //DataGrid 控件排序样式
     if(SortField != null)
     {
      //Page.Response.Write("<br>SortField:"+SortField);
      int i=0;
      string strtmp = null;
      for(i=0;i<dGrid.Columns.Count;i++)
      {
       strtmp = dGrid.Columns[i].HeaderText;
       strtmp = strtmp.Replace("<font face=/"Webdings/">6</font>","");
       strtmp = strtmp.Replace("<font face=/"Webdings/">5</font>","");
       dGrid.Columns[i].HeaderText = strtmp;
       if(dGrid.Columns[i].SortExpression.ToLower() == this.SortField.ToLower())
       {
        if(this.Order == OrderType.Desc)
        {
         dGrid.Columns[i].HeaderText = strtmp + "<font face=/"Webdings/">6</font>";
        }
        else
        {
         dGrid.Columns[i].HeaderText = strtmp + "<font face=/"Webdings/">5</font>";
        }
       }
      }
     }

     dGrid.DataSource = this._datasource;
     dGrid.DataBind();
    }
    else if(ControlType == "System.Web.UI.WebControls.DataList")
    {
     DataList dList = (DataList)DataControl;
     dList.DataSource = this._datasource;
     dList.DataBind();
    }
    else if(ControlType == "System.Web.UI.WebControls.Repeater")
    {
     Repeater RepList = (Repeater)DataControl;
     RepList.DataSource = this._datasource;
     RepList.DataBind();
    }
   }
   catch(SqlException ex)
   {
    Page.Response.Write("ErrorMessage:" + ex.Message);
    Page.Response.Write("<br>GetRecordFromPage '" + this.SelectTableName + "','"+this.KeyField+"','"+this.SelectFields+"',"+this.PageSize+","+this.CurPageIndex+",'"+this.Order.ToString()+"','"+this.SelectWhere+"',0,'"+this.SortField+"'");
   }
  }
  
  /// <summary>
  /// 上一页,下一页分页方式
  /// </summary>
  /// <returns></returns>
  private string NextPrevString()
  {
   StringBuilder sb = new StringBuilder();
   if(this.CurPageIndex <= 0)
   {
    sb.Append("首页");
    sb.Append("&nbsp;&nbsp;");
    sb.Append("上页&nbsp;&nbsp;");
   }
   else
   {
    sb.Append("<a style=/"cursor:hand/" onClick=/"jscript:" + this.UniqueID + ".value=0;" + Page.GetPostBackEventReference(this,"0")+ "/">首页</a>");
    sb.Append("&nbsp;&nbsp;");
    sb.Append("<a style=/"cursor:hand/" onClick=/"jscript:" + this.UniqueID + ".value=" + this.UniqueID + ".value*1-1;" + Page.GetPostBackEventReference(this,"0")+ "/">上页</a>&nbsp;&nbsp;");
   }
   if(this.CurPageIndex >= (this.PageCount-1))
   {
    sb.Append("下页");
    sb.Append("&nbsp;&nbsp;");
    sb.Append("末页");
   }
   else
   {
    sb.Append("<a style=/"cursor:hand/" onClick=/"jscript:" + this.UniqueID + ".value=" + this.UniqueID + ".value*1+1;" + Page.GetPostBackEventReference(this,"0")+ "/">下页</a>");
    sb.Append("&nbsp;&nbsp;");
    sb.Append("<a style=/"cursor:hand/" onClick=/"jscript:" + this.UniqueID + ".value=" + (this.PageCount-1).ToString() + ";" + Page.GetPostBackEventReference(this,"0")+ "/">末页</a>");
   }
   if(this.EnableGoVoid)
   {
    sb.Append("/n<script>/n");
    sb.Append("function Check_" + this.UniqueID + "_GoEnable(obj)/n{");
    sb.Append(" var maxPageIndex=" + (this.PageCount - 1).ToString() + ";/n");
    sb.Append(" if(isNaN(obj.value) == false && obj.value != '')/n{");
    sb.Append("  if(obj.value <= maxPageIndex && obj.value > 0)/n{/n document.forms[0]." + this.UniqueID + ".value=obj.value-1;/n return true;/n}else{/nreturn false;/n}/n");
    sb.Append(" }/n");//alert(DataPager1.value);" + this.UniqueID + ".value=obj.value-1;
    sb.Append("return false;/n");
    sb.Append("}/n");
    sb.Append("/n</script>/n");
    sb.Append("<input type=/"text/" class=/"" + this.NextPrevTextBoxCss + "/" value=/"" + (this.CurPageIndex + 1).ToString() + "/" id=/"Go_Text_" + this.UniqueID + "/"  Name=/"Go_Text_" + this.UniqueID + "/">");
    sb.Append("&nbsp;&nbsp;");
    sb.Append("&nbsp;");
    sb.Append("<input type=/"button/" class=/"" + this.GoButtonCss + "/" value=/"" + this.GoStr + "/" οnclick=/"if(Check_" + this.UniqueID + "_GoEnable(Go_Text_" + this.UniqueID +")==false){return false;}else{" + Page.GetPostBackEventReference(this,"0") + ";}/">");
   }
   return sb.ToString();
  }
  /// <summary>
  /// 数字分页
  /// </summary>
  /// <returns></returns>
  private string NumericPageString()
  {
   int max;
   int min;
   int i,len;
   int ShowSize = this.NumericPages;
   string tmp = null;
   StringBuilder sb = new StringBuilder();
   min = Convert.ToInt32(Math.Floor((this.CurPageIndex + 1) / ShowSize)) * ShowSize;
   max = min + ShowSize;
   len = this.PageCount;
   if(max > len)
   {
    max = len;
   }
   if(min >= ShowSize)
   {
    sb.Append("<a style=/"cursor:hand/" onClick=/"jscript:" + this.UniqueID + ".value=" + (min-2).ToString() + ";" + Page.GetPostBackEventReference(this, (min-2).ToString())+ "/" title=/"向前翻页/"><font face=webdings>9</font></a> ");
   }
   for(i = min;i <= max ;i++ )
   {
    if(i == this.CurPageIndex)
    {
     tmp = "<font class=/"" + "" + "/">" + (i+1).ToString() + "</font>";
    }
    else
    {
     tmp = (i+1).ToString();
    }
    if(this.NumericFormatString != null)
    {
     tmp = String.Format(NumericFormatString,tmp);
    }
    if(i <= max - 1)
    {
     sb.Append("<a style=/"cursor:hand/" οnclick=/"jscript:" + this.UniqueID + ".value=" + i.ToString() + ";" +  Page.GetPostBackEventReference(this, i.ToString())+ "/">" + tmp + "</a>");
    }
    
    if(i <= max - 2)
    {
     sb.Append(" " + this.NumericSeparator + " ");
    }
    else if(i == max - 1 && (max == min + 10))
    {
     sb.Append(" <a style=/"cursor:hand/" onClick=/"jscript:" + this.UniqueID + ".value=" + i.ToString() + ";" + Page.GetPostBackEventReference(this, i.ToString())+ "/" title=/"向后翻页/"><font face=webdings>:</font></a>");
    }
   }
   return sb.ToString();
  }

  private void DataGrid_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
  {
   this._SortField = e.SortExpression;
   string sort = e.SortExpression;
   if(_SortField != sort)
   {
    _SortField = sort;
    this.Order = OrderType.Desc;
   }
   else
   {
    if(this.Order == OrderType.Desc)
    {
     this.Order = OrderType.Asc;
    }
    else
    {
     this.Order = OrderType.Desc;
    }
   }
   GetDataSource();
  }
  private void DataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
  {
   if(this.IndexNumCell >= 0)
   {
    if(e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
     e.Item.Cells[this.IndexNumCell].Text = (e.Item.ItemIndex + this.CurPageIndex * this.PageSize).ToString();
    }
   }
  }

  #endregion
  
 }
 public class CusPageCtrlDesign : ControlDesigner
 {  
  public override string GetDesignTimeHtml()
  {
   DataPager control = (DataPager)Component;
   string tmp = "<span style=/"font-size:12px;color=#000000;background-color:#f5f5f5;padding:4px;border:1px solid #c7c7c7;border-top:1px solid #c7c7c7;border-left:1px solid #c7c7c7/">";
   tmp = tmp + "<strong>数据分页控件</strong>" + control.ID + "</span>";
   return tmp;
  }
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值