| 在 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; } } } |
| 查看该用户更多文章>> |


