参考原有的分页虚基类写的 还有一些地方记不太清 所以记录一下
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.OracleClient;
using System.Xml;
using NTPS.BASECLASS;
namespace NTPS.BASECLASS
{
public abstract class ListPager : System.Web.UI.Page
{
TextBox hidPageSize;
//每页显示最大数
private int pageMaxSize = PagerConstant.MAX_PAGER_NUM;
public int PageMaxSize
{
get { return pageMaxSize; }
set { pageMaxSize = value; }
}
//查询的类型
public enum SearchType
{
//首页
First,
//前页
Previous,
//次页
Next,
//尾页
Last,
//刷新
Refresh,
//转到
TurnTo
}
/// <summary>
/// 首页查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnFirst_Click(object sender, EventArgs e)
{
Search(SearchType.First);
}
/// <summary>
/// 前页查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnPrevious_Click(object sender, EventArgs e)
{
Search(SearchType.Previous);
}
/// <summary>
/// 次页查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnNext_Click(object sender, EventArgs e)
{
Search(SearchType.Next);
}
/// <summary>
/// 尾页查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnLast_Click(object sender, EventArgs e)
{
Search(SearchType.Last);
}
/// <summary>
/// 转到查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnTurnTo_Click(object sender, EventArgs e)
{
Search(SearchType.TurnTo);
}
/// <summary>
/// 数据绑定
/// </summary>
/// <param name="repeater">需要数据绑定的空间</param>
/// <param name="dt">获取的数据表</param>
private static void BindData(Repeater repeater, DataTable dt)
{
if (repeater != null)
{
repeater.DataSource = dt;
repeater.DataBind();
}
}
/// <summary>
/// 无查询条件时,加载首页
/// </summary>
/// <returns></returns>
public DataTable Search()
{
return Search(SearchType.First);
}
/// <summary>
/// 获取当前页面页数
/// </summary>
/// <param name="searchType">查询类型</param>
/// <param name="pageSizeText">页面显示文本</param>
/// <returns>当前页数</returns>
private int GetCurrentPageNo(SearchType searchType, string pageSize)
{
int currentPageNo = 0;
if (!SearchType.First.Equals(searchType))
{
if (!CheckUtility.IsEmpty(pageSize))
{
string[] size = pageSize.Trim().Split('|');
currentPageNo = int.Parse(size[0].Replace("第<span class='right-text'> ", "").Replace("</span> 页", ""));
}
}
return currentPageNo;
}
/// <summary>
/// 获取最大页数
/// </summary>
/// <param name="cmdText">command执行命令</param>
/// <returns>返回页数</returns>
private int FetchMaxNo(string cmdText)
{
cmdText = this.cmdTextReplace(cmdText);
DbUtility du = new DbUtility(cmdText);
object result = du.ExecuteQuery(cmdText);
int count = 0;
if (result != null)
{
count = Convert.ToInt32(result);
}
int maxPageNo = count / pageMaxSize;
if (count % pageMaxSize != 0)
{
maxPageNo++;
}
return maxPageNo;
}
/// <summary>
/// 获取当前页面页码状态,并设置画面显示效果
/// </summary>
/// <param name="searchType">查询类型</param>
/// <param name="firstButton">首页按钮</param>
/// <param name="previousButton">前页按钮</param>
/// <param name="nextButton">次页按钮</param>
/// <param name="lastButton">尾页按钮</param>
/// <param name="pageSize">页码显示</param>
/// <param name="maxPageNo">最大页码数</param>
/// <param name="currentPageNo">当前页码数</param>
/// <returns>返回设置后当前页码数</returns>
private int SetDisplayAttribute(SearchType searchType, LinkButton firstButton, LinkButton previousButton, LinkButton nextButton, LinkButton lastButton, HtmlTableCell pageSize, int maxPageNo, int currentPageNo)
{
if (SearchType.First.Equals(searchType))
{
currentPageNo = 1;
}
else if (SearchType.Previous.Equals(searchType))
{
currentPageNo--;
}
else if (SearchType.Next.Equals(searchType))
{
currentPageNo++;
}
else if (SearchType.Last.Equals(searchType))
{
currentPageNo = maxPageNo;
}
else if (SearchType.Refresh.Equals(searchType))
{
if (currentPageNo == 0)
{
currentPageNo++;
}
}
else
{
TextBox dePage = Page.FindControl("txtDestinationPage") as TextBox;
if (!CheckUtility.IsEmpty(dePage.Text))
{
if (dePage.Text.Length > 10)
{
currentPageNo = Convert.ToInt32(dePage.Text.Substring(0, 9));
dePage.Text = maxPageNo.ToString();
}
else if (Int32.Parse(dePage.Text.ToString().Trim()) > maxPageNo && dePage.Text.Length < 10)
{
currentPageNo = maxPageNo;
dePage.Text = maxPageNo.ToString();
}
else
{
currentPageNo = Convert.ToInt32(dePage.Text);
dePage.Text = Convert.ToString(Int32.Parse(dePage.Text.ToString().Trim()));
}
}
}
if (currentPageNo < maxPageNo)
{
nextButton.Enabled = true;
lastButton.Enabled = true;
}
else
{
currentPageNo = maxPageNo;
nextButton.Enabled = false;
lastButton.Enabled = false;
}
if (currentPageNo > 1)
{
firstButton.Enabled = true;
previousButton.Enabled = true;
}
else
{
firstButton.Enabled = false;
previousButton.Enabled = false;
}
pageSize.InnerHtml = "第<span class='right-text'> " + currentPageNo + "</span> 页 | 共 <span class='right-text'>" + maxPageNo + "</span> 页";
if (hidPageSize != null)
{
hidPageSize.Text = currentPageNo + "/" + maxPageNo;
}
return currentPageNo;
}
/// <summary>
/// 根据查询条件,将数据绑定到控件当中
/// </summary>
/// <param name="searchType">查询类型</param>
/// <returns>数据表</returns>
protected DataTable Search(SearchType searchType)
{
//首页Button
LinkButton firstButton = Page.FindControl("lkbtnFirst") as LinkButton;
//前页Button
LinkButton previousButton = FindControl("lkbtnPrevious") as LinkButton;
//次页Button
LinkButton nextButton = FindControl("lkbtnNext") as LinkButton;
//尾页Button
LinkButton lastButton = FindControl("lkbtnLast") as LinkButton;
//转到页Button
Button turntoButton = FindControl("btnTurnTo") as Button;
//页码
HtmlTableCell pageSize = FindControl("tdPageSize") as HtmlTableCell;
//页码(隐藏域)
hidPageSize = FindControl("hidPageSize") as TextBox;
//目标页码
TextBox dePage = FindControl("txtDestinationPage") as TextBox;
//数据显示空间Repeater
Repeater repeater = FindControl("repeaterData") as Repeater;
//最大页数
int maxPageNo = 0;
//当前页码
int currentPageNo = GetCurrentPageNo(searchType, pageSize.InnerText);
DataTable dt = new DataTable();
OracleCommand SearchCommand = GetOracleCommand();
if (SearchCommand != null)
{
DbUtility du = new DbUtility();
string commandText = SearchCommand.CommandText;
// 最大页码取得
maxPageNo = FetchMaxNo(commandText);
if (maxPageNo == 0)
{
// 数据绑定
BindData(repeater, dt);
pageSize.InnerText = "";
firstButton.Enabled = false;
previousButton.Enabled = false;
nextButton.Enabled = false;
lastButton.Enabled = false;
turntoButton.Enabled = false;
//dePage.Enabled = false;
return dt;
}
if (maxPageNo < 2)
{
turntoButton.Enabled = false;
}
else
{
turntoButton.Enabled = true;
}
currentPageNo = SetDisplayAttribute(searchType, firstButton, previousButton, nextButton, lastButton, pageSize, maxPageNo, currentPageNo);
SearchCommand.CommandText = commandText;
dt = du.ExecuteQuery(SearchCommand, (currentPageNo - 1) * pageMaxSize, pageMaxSize);
}
else
{
firstButton.Enabled = false;
previousButton.Enabled = false;
nextButton.Enabled = false;
lastButton.Enabled = false;
turntoButton.Enabled = false;
}
BindData(repeater, dt);
return dt;
}
/// <summary>
/// cmdText转换,将原有cmdText字符串转换成查询count的命令字符串
/// </summary>
/// <param name="cmdText">原查询命令字符串</param>
/// <returns>返回需要的字符串</returns>
private string cmdTextReplace(string cmdText)
{
string newCmdText = "SELECT COUNT(*) FROM (" + cmdText + ")";
return newCmdText;
}
/// <summary>
/// OracleCommand命令创建虚函数,要实现OracleCommand的完整实现,包括CommandText和CommandParameter
/// </summary>
/// <param name="cmdText">执行命令的语句</param>
/// <param name="ct">执行命令的类型:Procedure or Text or TableDirect</param>
/// <param name="paras">执行命令所需要的参数</param>
/// <returns>返回Oracle命令</returns>
public abstract OracleCommand GetOracleCommand();
}
}