在 Web 中实现数据分页的自动管理!嘿嘿
作者/天才 时间/2006-1-10 17:30:00 类别/开发技术 查看/
 发表评论 以论坛方式查看
标签:.Net联盟
作者:黄润成


    在 Web 中的数据分页问题,是比较头痛,不能使用《数据分页对象--不用再为数据分页问题而头痛罗,太好了》中定义的类,因为 Web 页面在 Post Back 后,IIS将创建新的页面对象,原来页面中创建的对象全都没有了,
。。。
    没有办法了吗?有!下面是对《数据分页对象--不用再为数据分页问题而头痛罗,太好了》中定义的数据分页类进行修改,再利用修改后的类开发的一个Web用户控件,可以轻松完成Web页面中的数据分页显示。


    请看下面代码:

一、分页对象类:

using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using it.com.cn.DbServices;

namespace it.com.cn.DbServices.SqlDbServices
{
/// <summary>
/// 数据分页。返回 DataSet 对象,或直接将数据绑定到控件。提供表态方法,并自动保存实例到页面的 Session 中。
/// </summary>
public class DataSetPagination
{
private int FPageSize;
private int FTotalRowsCount;
private int FCurrentPageNo;
private int FTotalPagesCount;
private string FSqlString;
private DbParams FParams;
private bool FFirstEnabled = false, FPreviousEnabled = false, FNextEnabled = true, FLastEnabled = true;
private string FSqlForCount;

public int PageSize
{
get
{
return FPageSize;
}
set
{
FPageSize = value;
if ((FTotalRowsCount % FPageSize) == 0)
{
FTotalPagesCount = (FTotalRowsCount % FPageSize);
}
else
{
FTotalPagesCount = (FTotalRowsCount % FPageSize) + 1;
}
}
}

public DbParams Params
{
get
{
return FParams;
}
set
{
FParams = value;
}
}


public int TotalRowsCount
{
get
{
return FTotalRowsCount;
}
}

public int CurrentPageNo
{
get
{
return FCurrentPageNo;
}
}

public int TotalPagesCount
{
get
{
return FTotalPagesCount;
}
}


public bool FirstEnabled
{
get
{
return FFirstEnabled;
}
}

public bool PreviousEnabled
{
get
{
return FPreviousEnabled;
}
}

public bool NextEnabled
{
get
{
return FNextEnabled;
}
}

public bool LastEnabled
{
get
{
return FLastEnabled;
}
}


public static DataSetPagination GetEntity(Page page)
{
if (page.Session[page.ToString()] != null)
return (DataSetPagination) page.Session[page.ToString()];
else
throw new Exception("数据分页对象不存在,或网页已过期!");
}

/// <summary>
/// 创建一个数据分页管理对象。
/// </summary>
/// <param name="page">关联页面。</param>
/// <param name="SqlString">查询数据SQL</param>
/// <param name="PageSize">每页的数据记录条数。</param>
public static DataSetPagination CreateEntity(Page page, string SqlString, int PageSize)
{
return new DataSetPagination(page, SqlString, new DbParams(), PageSize);
}

/// <summary>
/// 创建一个数据分页管理对象。
/// </summary>
/// <param name="page">关联页面。</param>
/// <param name="SqlString">查询数据SQL</param>
/// <param name="Params">查询参数对象数组。</param>
/// <param name="PageSize">每页的数据记录条数。</param>
public static DataSetPagination CreateEntity(Page page, string SqlString, DbParams Params, int PageSize)
{
return new DataSetPagination(page, SqlString, Params, PageSize);
}

private DataSetPagination(Page page, string SqlString, DbParams Params, int PageSize)
{
FParams = Params;
FPageSize = PageSize;

FSetSqlString(SqlString);

page.Session[page.ToString()] = this;
}

private void FSetSqlString(string SqlString)
{
FCurrentPageNo = 0;
FSqlString = SqlString;

string tmpSql = "";

int iSelect = SqlString.ToUpper().IndexOf("SELECT ");
int iDistinct = SqlString.ToUpper().IndexOf(" DISTINCT ");
int iTop = SqlString.ToUpper().IndexOf(" TOP ");

if ((iDistinct > -1) && (SqlString.Substring(iSelect + 6, iDistinct - iSelect - 5).Trim() == ""))
{
if (!((iTop > -1) && (SqlString.Substring(iDistinct + 10, iTop - iDistinct - 9).Trim() == "")))
{
tmpSql = "SELECT DISTINCT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf(" DISTINCT ") + 10);
}
else
{
tmpSql = SqlString;
}
}
else
{
if (!((iTop > -1) && (SqlString.Substring(iSelect + 6, iTop - iSelect - 5).Trim() == "")))
{
tmpSql = "SELECT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf("SELECT ") + 7);
}
else
{
tmpSql = SqlString;
}
}

FSqlForCount = "SELECT COUNT(*) AS RowsCount FROM (" + tmpSql + ") DERIVEDTBL";
RefreshCountInfo();
}

//因为在创建对象时要调用该方法,所以不能做成静态,否则用 GetEntity 来取得对象时对象尚未创建,产生异常。
public void RefreshCountInfo()
{
FTotalRowsCount = (int) DbService.ExecuteScalar(FSqlForCount, FParams);
if ((FTotalRowsCount % FPageSize) == 0)
{
FTotalPagesCount = (FTotalRowsCount / FPageSize);
}
else
{
FTotalPagesCount = (FTotalRowsCount / FPageSize) + 1;
}
}

public static void SetSqlString(Page page, string SqlString)
{
GetEntity(page).FSetSqlString(SqlString);
}


public static DataSet FirstPage(Page page)
{
DataSetPagination dp = GetEntity(page);
if (dp != null)
{
dp.FCurrentPageNo = 1;
dp.SetButtonStatus();
return DbService.ExecuteDataSet(dp.FSqlString, dp.FParams, 0, dp.FPageSize);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static DataSet PreviousPage(Page page)
{
DataSetPagination dp = GetEntity(page);
if (dp != null)
{
if (dp.FCurrentPageNo > 1)
dp.FCurrentPageNo--;
dp.SetButtonStatus();
return DbService.ExecuteDataSet(dp.FSqlString, dp.FParams, dp.FPageSize * (dp.FCurrentPageNo - 1), dp.FPageSize);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static DataSet NextPage(Page page)
{
DataSetPagination dp = GetEntity(page);
if (dp != null)
{
if (dp.FCurrentPageNo < dp.FTotalPagesCount)
dp.FCurrentPageNo++;
dp.SetButtonStatus();
return DbService.ExecuteDataSet(dp.FSqlString, dp.FParams, dp.FPageSize * (dp.FCurrentPageNo -1), dp.FPageSize);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static DataSet LastPage(Page page)
{
DataSetPagination dp = GetEntity(page);
if (dp != null)
{
dp.FCurrentPageNo = dp.FTotalPagesCount;
dp.SetButtonStatus();
return DbService.ExecuteDataSet(dp.FSqlString, dp.FParams, dp.FPageSize * (dp.FCurrentPageNo - 1), dp.FPageSize);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static DataSet GotoPage(Page page, int PageNo)
{
DataSetPagination dp = GetEntity(page);
if (dp != null)
{
if (PageNo < 1)
{
dp.FCurrentPageNo = 1;
}
else if (PageNo > dp.FTotalPagesCount)
{
dp.FCurrentPageNo = dp.FTotalPagesCount;
}
else
{
dp.FCurrentPageNo = PageNo;
}
dp.SetButtonStatus();
return DbService.ExecuteDataSet(dp.FSqlString, dp.FParams, dp.FPageSize * (dp.FCurrentPageNo - 1), dp.FPageSize);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

#region 删除此段,统一改为传入 Control 类型的数据绑定控件,再在代码中判断具体的类型。
// public static void FirstPage(Page page, Repeater RefRepeater)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == 1 || RefRepeater == null)
//// {
//// return;
//// }
// RefRepeater.DataSource = FirstPage(page);
// RefRepeater.DataBind();
// }
//
// public static void PreviousPage(Page page, Repeater RefRepeater)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == 1 || RefRepeater == null)
//// {
//// return;
//// }
// RefRepeater.DataSource = PreviousPage(page);
// RefRepeater.DataBind();
// }
//
// public static void NextPage(Page page, Repeater RefRepeater)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == dp.FTotalPagesCount || RefRepeater == null)
//// {
//// return;
//// }
// RefRepeater.DataSource = NextPage(page);
// RefRepeater.DataBind();
// }
//
// public static void LastPage(Page page, Repeater RefRepeater)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == dp.FTotalPagesCount || RefRepeater == null)
//// {
//// return;
//// }
// RefRepeater.DataSource = LastPage(page);
// RefRepeater.DataBind();
// }
//
// public static void GotoPage(Page page, Repeater RefRepeater, int PageNo)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == PageNo || RefRepeater == null)
//// {
//// return;
//// }
// RefRepeater.DataSource = GotoPage(page, PageNo);
// RefRepeater.DataBind();
// }
//
//
// public static void FirstPage(Page page, BaseDataList RefDataList)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == 1 || RefDataList == null)
//// {
//// return;
//// }
// RefDataList.DataSource = FirstPage(page);
// RefDataList.DataBind();
// }
//
// public static void PreviousPage(Page page, BaseDataList RefDataList)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == 1 || RefDataList == null)
//// {
//// return;
//// }
// RefDataList.DataSource = PreviousPage(page);
// RefDataList.DataBind();
// }
//
// public static void NextPage(Page page, BaseDataList RefDataList)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == dp.FTotalPagesCount || RefDataList == null)
//// {
//// return;
//// }
// RefDataList.DataSource = NextPage(page);
// RefDataList.DataBind();
// }
//
// public static void LastPage(Page page, BaseDataList RefDataList)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == dp.FTotalPagesCount || RefDataList == null)
//// {
//// return;
//// }
// RefDataList.DataSource = LastPage(page);
// RefDataList.DataBind();
// }
//
// public static void GotoPage(Page page, BaseDataList RefDataList, int PageNo)
// {
//// DataSetPagination dp = DataSetPagination.GetEntity(page);
//// if (dp == null || dp.FCurrentPageNo == PageNo || RefDataList == null)
//// {
//// return;
//// }
// RefDataList.DataSource = GotoPage(page, PageNo);
// RefDataList.DataBind();
// }
#endregion

private static void BindData(DataSet ADataSet, Control ADataViewer)
{
if (ADataViewer is Repeater)
{
((Repeater) ADataViewer).DataSource = ADataSet;
((Repeater) ADataViewer).DataBind();
}
else if (ADataViewer is BaseDataList)
{
((BaseDataList) ADataViewer).DataSource = ADataSet;
((BaseDataList) ADataViewer).DataBind();
}
else
{
throw new Exception("数据绑定控件类型错误!\n当前只支持 Repeater 及 BaseDataList 类型的数据绑定控件。");
}
}

public static void FirstPage(Page page, Control ADataViewer)
{
BindData(FirstPage(page), ADataViewer);
}

public static void PreviousPage(Page page, Control ADataViewer)
{
BindData(PreviousPage(page), ADataViewer);
}

public static void NextPage(Page page, Control ADataViewer)
{
BindData(NextPage(page), ADataViewer);
}

public static void LastPage(Page page, Control ADataViewer)
{
BindData(LastPage(page), ADataViewer);
}

public static void GotoPage(Page page, Control ADataViewer, int PageNo)
{
BindData(GotoPage(page, PageNo), ADataViewer);
}



private void SetButtonStatus()
{
if (FTotalPagesCount == 1 || FTotalPagesCount == 0)
{
FFirstEnabled = false;
FPreviousEnabled = false;
FNextEnabled = false;
FLastEnabled = false;
}
else if (FCurrentPageNo == 1)
{
FFirstEnabled = false;
FPreviousEnabled = false;
FNextEnabled = true;
FLastEnabled = true;
}
else if (FCurrentPageNo == FTotalPagesCount)
{
FFirstEnabled = true;
FPreviousEnabled = true;
FNextEnabled = false;
FLastEnabled = false;
}
else
{
FFirstEnabled = true;
FPreviousEnabled = true;
FNextEnabled = true;
FLastEnabled = true;
}
}

public static void SetButtonsStatus(WebControl FirstButton, WebControl PreviousButton, WebControl NextButton, WebControl LastButton)
{
DataSetPagination dp = (DataSetPagination) FirstButton.Page.Session[FirstButton.Page.ToString()];
if (dp != null)
{
FirstButton.Enabled = dp.FFirstEnabled;
PreviousButton.Enabled = dp.FPreviousEnabled;
NextButton.Enabled = dp.FNextEnabled;
LastButton.Enabled = dp.FLastEnabled;
}
}

public static void SetButtonsStatus(HtmlControl FirstButton, HtmlControl PreviousButton, HtmlControl NextButton, HtmlControl LastButton)
{
DataSetPagination dp = (DataSetPagination) FirstButton.Page.Session[FirstButton.Page.ToString()];
if (dp != null)
{
FirstButton.Disabled = !dp.FFirstEnabled;
PreviousButton.Disabled = !dp.FPreviousEnabled;
NextButton.Disabled = !dp.FNextEnabled;
LastButton.Disabled = !dp.FLastEnabled;
}
}
}


/// <summary>
/// 数据分页。返回 IDataReaderWrapper 实例对象,或直接将数据绑定到控件。提供表态方法,并自动保存实例到页面的 Session 中。
/// </summary>
public class ReaderPagination
{
private int FPageSize;
private int FTotalRowsCount;
private int FCurrentPageNo;
private int FTotalPagesCount;
private string FSqlString;
private DbParams FParams;
private bool FFirstEnabled = false, FPreviousEnabled = false, FNextEnabled = true, FLastEnabled = true;
private string FSqlForCount;

public int PageSize
{
get
{
return FPageSize;
}
set
{
FPageSize = value;
if ((FTotalRowsCount % FPageSize) == 0)
{
FTotalPagesCount = (FTotalRowsCount % FPageSize);
}
else
{
FTotalPagesCount = (FTotalRowsCount % FPageSize) + 1;
}
}
}

public DbParams Params
{
get
{
return FParams;
}
set
{
FParams = value;
}
}


public int TotalRowsCount
{
get
{
return FTotalRowsCount;
}
}

public int CurrentPageNo
{
get
{
return FCurrentPageNo;
}
}

public int TotalPagesCount
{
get
{
return FTotalPagesCount;
}
}


public bool FirstEnabled
{
get
{
return FFirstEnabled;
}
}

public bool PreviousEnabled
{
get
{
return FPreviousEnabled;
}
}

public bool NextEnabled
{
get
{
return FNextEnabled;
}
}

public bool LastEnabled
{
get
{
return FLastEnabled;
}
}

public static ReaderPagination GetEntity(Page page)
{
if (page.Session[page.ToString()] != null)
return (ReaderPagination) page.Session[page.ToString()];
else
throw new Exception("分页对象不存在,或网页已过期!");
}

/// <summary>
/// 创建一个数据分页管理对象。
/// </summary>
/// <param name="page">关联页面。</param>
/// <param name="SqlString">查询语句</param>
/// <param name="KeyField">关键字段。</param>
/// <param name="PageSize">每页的数据记录条数。</param>
public static ReaderPagination CreateEntity(Page page, string SqlString, string KeyField, int PageSize)
{
return new ReaderPagination(page, SqlString, KeyField, new DbParams(), PageSize);
}

/// <summary>
/// 创建一个数据分页管理对象。
/// </summary>
/// <param name="page">关联页面。</param>
/// <param name="SqlString">查询语句</param>
/// <param name="KeyField">关键字段。</param>
/// <param name="Params">查询参数对象数组。</param>
/// <param name="PageSize">每页的数据记录条数。</param>
public static ReaderPagination CreateEntity(Page page, string SqlString, string KeyField, DbParams Params, int PageSize)
{
return new ReaderPagination(page, SqlString, KeyField, Params, PageSize);
}

private ReaderPagination(Page page, string SqlString, string KeyField, DbParams Params, int PageSize)
{
FParams = Params;
FPageSize = PageSize;

FSetSqlString(SqlString, KeyField);

page.Session[page.ToString()] = this;
}

/// <summary>
/// 重新设置 FSqlString 。
/// </summary>
/// <param name="SqlString">新 SqlString </param>
/// <param name="KeyField">关键字段。</param>
private void FSetSqlString(string SqlString, string KeyField)
{
FCurrentPageNo = 0;

string tmpSql = "";

int iSelect = SqlString.ToUpper().IndexOf("SELECT ");
int iDistinct = SqlString.ToUpper().IndexOf(" DISTINCT ");
int iTop = SqlString.ToUpper().IndexOf(" TOP ");

if ((iDistinct > -1) && (SqlString.Substring(iSelect + 6, iDistinct - iSelect - 5).Trim() == ""))
{
if (!((iTop > -1) && (SqlString.Substring(iDistinct + 10, iTop - iDistinct - 9).Trim() == "")))
{
tmpSql = "SELECT DISTINCT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf(" DISTINCT ") + 10);
}
else
{
tmpSql = SqlString;
}
}
else
{
if (!((iTop > -1) && (SqlString.Substring(iSelect + 6, iTop - iSelect - 5).Trim() == "")))
{
tmpSql = "SELECT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf("SELECT ") + 7);
}
else
{
tmpSql = SqlString;
}
}

FSqlString = "SELECT TOP @@PageSize * FROM (" + tmpSql + ") DERIVEDTBL1 WHERE " + KeyField + " NOT IN ( SELECT TOP @@CurrentRows " + 
KeyField + " FROM (" + tmpSql + " ) DERIVEDTBL2 ) ";

FSqlForCount = "SELECT COUNT(*) AS RowsCount FROM (" + tmpSql + ") DERIVEDTBL";
RefreshCountInfo();
}

//因为在创建对象时要调用该方法,所以不能做成静态,否则用 GetEntity 来取得对象时对象尚未创建,产生异常。
public void RefreshCountInfo()
{
FTotalRowsCount = (int) DbService.ExecuteScalar(FSqlForCount, FParams);

if ((FTotalRowsCount % FPageSize) == 0)
{
FTotalPagesCount = (FTotalRowsCount / FPageSize);
}
else
{
FTotalPagesCount = (FTotalRowsCount / FPageSize) + 1;
}
}


/// <summary>
/// 重新设置 SqlString
/// </summary>
/// <param name="page">关联页面。</param>
/// <param name="SqlString">新 SqlString</param>
/// <param name="KeyField">新 KeyField</param>
public static void SetSqlString(Page page, string SqlString, string KeyField)
{
GetEntity(page).FSetSqlString(SqlString, KeyField);
}

public static IDataReaderWrapper FirstPage(Page page)
{
ReaderPagination dp = GetEntity(page);
if (dp != null)
{
dp.FCurrentPageNo = 1;
dp.SetButtonStatus();
dp.FSqlString = dp.FSqlString.Replace("@@PageSize", dp.PageSize.ToString());
dp.FSqlString = dp.FSqlString.Replace("@@CurrentRows", (dp.PageSize * dp.CurrentPageNo).ToString());
return DbService.ExecuteReader(dp.FSqlString, dp.FParams);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static IDataReaderWrapper PreviousPage(Page page)
{
ReaderPagination dp = GetEntity(page);
if (dp != null)
{
if (dp.FCurrentPageNo > 1)
dp.FCurrentPageNo--;
dp.SetButtonStatus();
dp.FSqlString = dp.FSqlString.Replace("@@PageSize", dp.PageSize.ToString());
dp.FSqlString = dp.FSqlString.Replace("@@CurrentRows", (dp.PageSize * dp.CurrentPageNo).ToString());
return DbService.ExecuteReader(dp.FSqlString, dp.FParams);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static IDataReaderWrapper NextPage(Page page)
{
ReaderPagination dp = GetEntity(page);
if (dp != null)
{
if (dp.FCurrentPageNo < dp.FTotalPagesCount)
dp.FCurrentPageNo++;
dp.SetButtonStatus();
dp.FSqlString = dp.FSqlString.Replace("@@PageSize", dp.PageSize.ToString());
dp.FSqlString = dp.FSqlString.Replace("@@CurrentRows", (dp.PageSize * dp.CurrentPageNo).ToString());
return DbService.ExecuteReader(dp.FSqlString, dp.FParams);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static IDataReaderWrapper LastPage(Page page)
{
ReaderPagination dp = GetEntity(page);
if (dp != null)
{
dp.FCurrentPageNo = dp.FTotalPagesCount;
dp.SetButtonStatus();
dp.FSqlString = dp.FSqlString.Replace("@@PageSize", dp.PageSize.ToString());
dp.FSqlString = dp.FSqlString.Replace("@@CurrentRows", (dp.PageSize * dp.CurrentPageNo).ToString());
return DbService.ExecuteReader(dp.FSqlString, dp.FParams);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

public static IDataReaderWrapper GotoPage(Page page, int PageNo)
{
ReaderPagination dp = GetEntity(page);
if (dp != null)
{
if (PageNo < 1)
{
dp.FCurrentPageNo = 1;
}
else if (PageNo > dp.FTotalPagesCount)
{
dp.FCurrentPageNo = dp.FTotalPagesCount;
}
else
{
dp.FCurrentPageNo = PageNo;
}
dp.SetButtonStatus();
dp.FSqlString = dp.FSqlString.Replace("@@PageSize", dp.PageSize.ToString());
dp.FSqlString = dp.FSqlString.Replace("@@CurrentRows", (dp.PageSize * dp.CurrentPageNo).ToString());
return DbService.ExecuteReader(dp.FSqlString, dp.FParams);
}
else
{
throw new Exception("获取数据分页对象出错!");
}
}

#region 删除此段,统一改为传入 Control 类型的数据绑定控件,再在代码中判断具体的类型。
// public static void FirstPage(Page page, Repeater RefRepeater)
// {
// IDataReaderWrapper reader = FirstPage(page);
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void PreviousPage(Page page, Repeater RefRepeater)
// {
// IDataReaderWrapper reader = PreviousPage(page);
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void NextPage(Page page, Repeater RefRepeater)
// {
// IDataReaderWrapper reader = NextPage(page);
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void LastPage(Page page, Repeater RefRepeater)
// {
// IDataReaderWrapper reader = LastPage(page);
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void GotoPage(Page page, Repeater RefRepeater, int PageNo)
// {
// IDataReaderWrapper reader = GotoPage(page, PageNo);
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
//
// public static void FirstPage(Page page, BaseDataList RefDataList)
// {
// IDataReaderWrapper reader = FirstPage(page);
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void PreviousPage(Page page, BaseDataList RefDataList)
// {
// IDataReaderWrapper reader = PreviousPage(page);
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void NextPage(Page page, BaseDataList RefDataList)
// {
// IDataReaderWrapper reader = NextPage(page);
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void LastPage(Page page, BaseDataList RefDataList)
// {
// IDataReaderWrapper reader = LastPage(page);
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public static void GotoPage(Page page, BaseDataList RefDataList, int PageNo)
// {
// IDataReaderWrapper reader = GotoPage(page, PageNo);
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
#endregion

/// <summary>
/// 绑定数据到数据绑定控件。
/// </summary>
/// <param name="reader">绑定的数据源。</param>
/// <param name="ADataViewer">绑定的数据控件。</param>
private static void BindData(IDataReaderWrapper reader, Control ADataViewer)
{
if (ADataViewer is Repeater)
{
((Repeater) ADataViewer).DataSource = reader;
((Repeater) ADataViewer).DataBind();
}
else if (ADataViewer is BaseDataList)
{
((BaseDataList) ADataViewer).DataSource = reader;
((BaseDataList) ADataViewer).DataBind();
}
else
{
throw new Exception("数据绑定控件类型错误!\n当前只支持 Repeater 及 BaseDataList 类型的数据绑定控件。");
}
}


public static void FirstPage(Page page, Control ADataViewer)
{
IDataReaderWrapper reader = FirstPage(page);
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public static void PreviousPage(Page page, Control ADataViewer)
{
IDataReaderWrapper reader = PreviousPage(page);
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public static void NextPage(Page page, Control ADataViewer)
{
IDataReaderWrapper reader = NextPage(page);
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public static void LastPage(Page page, Control ADataViewer)
{
IDataReaderWrapper reader = LastPage(page);
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public static void GotoPage(Page page, Control ADataViewer, int PageNo)
{
IDataReaderWrapper reader = GotoPage(page, PageNo);
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}



private void SetButtonStatus()
{
if (FTotalPagesCount == 1 || FTotalPagesCount == 0)
{
FFirstEnabled = false;
FPreviousEnabled = false;
FNextEnabled = false;
FLastEnabled = false;
}
else if (FCurrentPageNo == 1)
{
FFirstEnabled = false;
FPreviousEnabled = false;
FNextEnabled = true;
FLastEnabled = true;
}
else if (FCurrentPageNo == FTotalPagesCount)
{
FFirstEnabled = true;
FPreviousEnabled = true;
FNextEnabled = false;
FLastEnabled = false;
}
else
{
FFirstEnabled = true;
FPreviousEnabled = true;
FNextEnabled = true;
FLastEnabled = true;
}
}

public static void SetButtonsStatus(WebControl FirstButton, WebControl PreviousButton, WebControl NextButton, WebControl LastButton)
{
ReaderPagination dp = GetEntity(FirstButton.Page);
if (dp != null)
{
FirstButton.Enabled = dp.FFirstEnabled;
PreviousButton.Enabled = dp.FPreviousEnabled;
NextButton.Enabled = dp.FNextEnabled;
LastButton.Enabled = dp.FLastEnabled;
}
}


public static void SetButtonsStatus(HtmlControl FirstButton, HtmlControl PreviousButton, HtmlControl NextButton, HtmlControl LastButton)
{
ReaderPagination dp = GetEntity(FirstButton.Page);
if (dp != null)
{
FirstButton.Disabled = !dp.FFirstEnabled;
PreviousButton.Disabled = !dp.FPreviousEnabled;
NextButton.Disabled = !dp.FNextEnabled;
LastButton.Disabled = !dp.FLastEnabled;
}
}

}



/// <summary>
/// 数据分页,返回 IDataReaderWrapper 实例对象,或直接将数据绑定到控件。仅提供实例方法,且必须将第一次获得的对象保存到 ViewState 或 Session 中。
/// </summary>
[Serializable]
public class InsReaderPage
{
private int FPageSize;
private int FTotalRowsCount;
private int FCurrentPageNo;
private int FTotalPagesCount;
private string FSqlString;
private DbParams FParams;
private bool FFirstEnabled = false, FPreviousEnabled = false, FNextEnabled = true, FLastEnabled = true;
private string FSqlForCount;

public int PageSize
{
get
{
return FPageSize;
}
set
{
FPageSize = value;
if ((FTotalRowsCount % FPageSize) == 0)
{
FTotalPagesCount = (FTotalRowsCount % FPageSize);
}
else
{
FTotalPagesCount = (FTotalRowsCount % FPageSize) + 1;
}
}
}

public DbParams Params
{
get
{
return FParams;
}
set
{
FParams = value;
}
}


public int TotalRowsCount
{
get
{
return FTotalRowsCount;
}
}

public int CurrentPageNo
{
get
{
return FCurrentPageNo;
}
}

public int TotalPagesCount
{
get
{
return FTotalPagesCount;
}
}


public bool FirstEnabled
{
get
{
return FFirstEnabled;
}
}

public bool PreviousEnabled
{
get
{
return FPreviousEnabled;
}
}

public bool NextEnabled
{
get
{
return FNextEnabled;
}
}

public bool LastEnabled
{
get
{
return FLastEnabled;
}
}


public InsReaderPage(string SqlString, string KeyField, int PageSize)
{
CreateInsReaderPage(SqlString, KeyField, new DbParams(), PageSize);
}

public InsReaderPage(string SqlString, string KeyField, DbParams Params, int PageSize)
{
CreateInsReaderPage(SqlString, KeyField, Params, PageSize);
}

private void CreateInsReaderPage(string SqlString, string KeyField, DbParams Params, int PageSize)
{
FParams = Params;
FPageSize = PageSize;
SetSqlString(SqlString, KeyField);
}


/// <summary>
/// 重新设置 FSqlString 。
/// </summary>
/// <param name="SqlString">新 SqlString </param>
/// <param name="KeyField">关键字段。</param>
public void SetSqlString(string SqlString, string KeyField)
{
FCurrentPageNo = 0;
string tmpSql = "";

int iSelect = SqlString.ToUpper().IndexOf("SELECT ");
int iDistinct = SqlString.ToUpper().IndexOf(" DISTINCT ");
int iTop = SqlString.ToUpper().IndexOf(" TOP ");

if ((iDistinct > -1) && (SqlString.Substring(iSelect + 6, iDistinct - iSelect - 5).Trim() == ""))
{
if (!((iTop > -1) && (SqlString.Substring(iDistinct + 10, iTop - iDistinct - 9).Trim() == "")))
{
tmpSql = "SELECT DISTINCT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf(" DISTINCT ") + 10);
}
else
{
tmpSql = SqlString;
}
}
else
{
if (!((iTop > -1) && (SqlString.Substring(iSelect + 6, iTop - iSelect - 5).Trim() == "")))
{
tmpSql = "SELECT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf("SELECT ") + 7);
}
else
{
tmpSql = SqlString;
}
}

FSqlString = "SELECT TOP @@PageSize * FROM (" + tmpSql + ") DERIVEDTBL1 WHERE " + KeyField + " NOT IN ( SELECT TOP @@CurrentRows " + 
KeyField + " FROM (" + tmpSql + " ) DERIVEDTBL2 ) ";

FSqlForCount = "SELECT COUNT(*) AS RowsCount FROM (" + tmpSql + ") DERIVEDTBL";
            RefreshCountInfo();
}

public void RefreshCountInfo()
{
FTotalRowsCount = (int) DbService.ExecuteScalar(FSqlForCount, FParams);

if ((FTotalRowsCount % FPageSize) == 0)
{
FTotalPagesCount = (FTotalRowsCount / FPageSize);
}
else
{
FTotalPagesCount = (FTotalRowsCount / FPageSize) + 1;
}
}

public IDataReaderWrapper FirstPage()
{
FCurrentPageNo = 1;
SetButtonStatus();
string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString());
SqlString = SqlString.Replace("@@CurrentRows", "0");
return DbService.ExecuteReader(SqlString, FParams);
}

public IDataReaderWrapper PreviousPage()
{
if (FCurrentPageNo > 1)
FCurrentPageNo--;
SetButtonStatus();
string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString());
SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (CurrentPageNo-1)).ToString());
return DbService.ExecuteReader(SqlString, FParams);
}

public IDataReaderWrapper NextPage()
{
if (FCurrentPageNo < FTotalPagesCount)
FCurrentPageNo++;
SetButtonStatus();
string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString());
SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (CurrentPageNo-1)).ToString());
return DbService.ExecuteReader(SqlString, FParams);
}

public IDataReaderWrapper LastPage()
{
FCurrentPageNo = FTotalPagesCount;
SetButtonStatus();
string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString());
SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (CurrentPageNo-1)).ToString());
return DbService.ExecuteReader(SqlString, FParams);
}

public IDataReaderWrapper GotoPage(int PageNo)
{
if (PageNo < 1)
{
FCurrentPageNo = 1;
}
else if (PageNo > FTotalPagesCount)
{
FCurrentPageNo = FTotalPagesCount;
}
else
{
FCurrentPageNo = PageNo;
}
SetButtonStatus();
string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString());
SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (CurrentPageNo-1)).ToString());
return DbService.ExecuteReader(SqlString, FParams);
}



#region 删除此段,统一改为传入 Control 类型的数据绑定控件,再在代码中判断具体的类型。
// public void FirstPage(Repeater RefRepeater)
// {
//// if (FCurrentPageNo == 1 || RefRepeater == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = FirstPage();
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void PreviousPage(Repeater RefRepeater)
// {
//// if (FCurrentPageNo == 1 || RefRepeater == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = PreviousPage();
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void NextPage(Repeater RefRepeater)
// {
//// if (FCurrentPageNo == FTotalPagesCount || RefRepeater == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = NextPage();
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void LastPage(Repeater RefRepeater)
// {
//// if (FCurrentPageNo == FTotalPagesCount || RefRepeater == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = LastPage();
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void GotoPage(Repeater RefRepeater, int PageNo)
// {
//// if (FCurrentPageNo == PageNo || RefRepeater == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = GotoPage(PageNo);
// try
// {
// RefRepeater.DataSource = reader;
// RefRepeater.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
//
// public void FirstPage(BaseDataList RefDataList)
// {
//// if (FCurrentPageNo == 1 || RefDataList == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = FirstPage();
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void PreviousPage(BaseDataList RefDataList)
// {
//// if (FCurrentPageNo == 1 || RefDataList == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = PreviousPage();
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void NextPage(BaseDataList RefDataList)
// {
//// if (FCurrentPageNo == FTotalPagesCount || RefDataList == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = NextPage();
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void LastPage(BaseDataList RefDataList)
// {
//// if (FCurrentPageNo == FTotalPagesCount || RefDataList == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = LastPage();
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
//
// public void GotoPage(BaseDataList RefDataList, int PageNo)
// {
//// if (FCurrentPageNo == PageNo || RefDataList == null)
//// {
//// return;
//// }
// IDataReaderWrapper reader = GotoPage(PageNo);
// try
// {
// RefDataList.DataSource = reader;
// RefDataList.DataBind();
// }
// finally
// {
// reader.Close();
// }
// }
#endregion

private void BindData(IDataReaderWrapper reader, Control ADataViewer)
{
if (ADataViewer is Repeater)
{
((Repeater) ADataViewer).DataSource = reader;
((Repeater) ADataViewer).DataBind();
}
else if (ADataViewer is BaseDataList)
{
((BaseDataList) ADataViewer).DataSource = reader;
((BaseDataList) ADataViewer).DataBind();
}
else
{
throw new Exception("数据绑定控件类型错误!\n当前只支持 Repeater 及 BaseDataList 类型的数据绑定控件。");
}
}


public void FirstPage(Control ADataViewer)
{
IDataReaderWrapper reader = FirstPage();
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public void PreviousPage(Control ADataViewer)
{
IDataReaderWrapper reader = PreviousPage();
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public void NextPage(Control ADataViewer)
{
IDataReaderWrapper reader = NextPage();
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public void LastPage(Control ADataViewer)
{
IDataReaderWrapper reader = LastPage();
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}

public void GotoPage(Control ADataViewer, int PageNo)
{
IDataReaderWrapper reader = GotoPage(PageNo);
try
{
BindData(reader, ADataViewer);
}
finally
{
reader.Close();
}
}


private void SetButtonStatus()
{
if (FTotalPagesCount == 1 || FTotalPagesCount == 0)
{
FFirstEnabled = false;
FPreviousEnabled = false;
FNextEnabled = false;
FLastEnabled = false;
}
else if (FCurrentPageNo == 1)
{
FFirstEnabled = false;
FPreviousEnabled = false;
FNextEnabled = true;
FLastEnabled = true;
}
else if (FCurrentPageNo == FTotalPagesCount)
{
FFirstEnabled = true;
FPreviousEnabled = true;
FNextEnabled = false;
FLastEnabled = false;
}
else
{
FFirstEnabled = true;
FPreviousEnabled = true;
FNextEnabled = true;
FLastEnabled = true;
}
}

public void SetButtonsStatus(WebControl FirstButton, WebControl PreviousButton, WebControl NextButton, WebControl LastButton)
{
FirstButton.Enabled = FFirstEnabled;
PreviousButton.Enabled = FPreviousEnabled;
NextButton.Enabled = FNextEnabled;
LastButton.Enabled = FLastEnabled;
}

public void SetButtonsStatus(HtmlControl FirstButton, HtmlControl PreviousButton, HtmlControl NextButton, HtmlControl LastButton)
{
FirstButton.Disabled = !FFirstEnabled;
PreviousButton.Disabled = !FPreviousEnabled;
NextButton.Disabled = !FNextEnabled;
LastButton.Disabled = !FLastEnabled;
}

}


}
查看该用户更多文章>>