.NET程式分頁(僅支持MSSQL2005及以上)

来源:http://www.cnblogs.com/Alwayswantmore/archive/2017/06/05/Pagination_1.html
-Advertisement-
Play Games

aspx <asp:TextBox ID="txtKeywords" runat="server" CssClass="keyword" style="width:731%;margin-left:-20em;" placeholder="輸入姓名/手機號/身份證號碼進行搜索" /> <asp:Li ...


aspx

<asp:TextBox ID="txtKeywords" runat="server" CssClass="keyword" style="width:731%;margin-left:-20em;" placeholder="輸入姓名/手機號/身份證號碼進行搜索" />

<asp:LinkButton ID="lbtnSearch" runat="server" CssClass="btn-search" OnClick="lbtnSearch_Click">查詢</asp:LinkButton>

 

<%#rptList.Items.Count == 0 ? "<tr><td align=\"center\" colspan=\"14\">暫無記錄</td></tr>" : ""%>

<span>顯示</span><asp:TextBox ID="txtPageNum" runat="server" CssClass="pagenum" onkeydown="return checkNumber(event);"
                OnTextChanged="txtPageNum_TextChanged" AutoPostBack="True"></asp:TextBox><span>條/頁</span>

<div id="PageContent" runat="server" class="default"></div>

CodeBehind

命名空間

public partial class xxx : Web.UI.ManagePage
{

protected int totalCount;//總記錄數
protected int page;//當前頁面
protected int pageSize;//每頁數據大小
protected string keywords = string.Empty;//查詢條件

protected void Page_Load(object sender, EventArgs e)
    {

     this.keywords = Utils..GetQueryString("keywords");//獲取查詢條件
            this.pageSize = GetPageSize(10); //設置每頁數據大小

            if (!Page.IsPostBack)
            {

    RptBind("根據keywords整合的查詢語句", "排序欄位 asc/desc");

     }

   }

private void RptBind(string _strWhere, string _orderby)
        {
            this.page = Utils.GetQueryInt("page", 1);
            txtKeywords.Text = this.keywords;
            BLL.Business bll = new BLL.Business();
            this.rptList.DataSource = bll.GetList(this.pageSize, this.page, _strWhere, _orderby, out totalCount,out totalIncome);
            this.rptList.DataBind();
            lblTotalIncome.Text = Math.Round(totalIncome, 3).ToString();
            txtPageNum.Text = this.pageSize.ToString();
            string pageUrl = Utils.CombUrlTxt("xxx.aspx", "keywords={0}&page={1}", this.keywords, "__id__");
            PageContent.InnerHtml = Utils.OutPageList(this.pageSize, this.page, this.totalCount, pageUrl, 8);
        }

private int GetPageSize(int _default_size)
        {
            int _pagesize;
            if (int.TryParse(Utils.GetCookie("detail_page_size", "NovelPage"), out _pagesize))
            {
                if (_pagesize > 0)
                {
                    return _pagesize;
                }
            }
            return _default_size;
        }

protected void lbtnSearch_Click(object sender, EventArgs e)
        {
            Response.Redirect(Utils.CombUrlTxt("xxx.aspx", "keywords={0}", txtKeywords.Text));
        }

protected void txtPageNum_TextChanged(object sender, EventArgs e)
        {
            int _pagesize;
            if (int.TryParse(txtPageNum.Text.Trim(), out _pagesize))
            {
                if (_pagesize > 0)
                {
                    Utils.WriteCookie("detail_page_size", "NovelPage", _pagesize.ToString(), 14400);
                }
            }
            Response.Redirect(Utils.CombUrlTxt("xxx.aspx", "keywords={0}", this.keywords));
        }

}

Utils

命名空間

public class Utils
{

public static string GetQueryString(string strName)
        {
            return GetQueryString(strName, false);
        }

public static string GetQueryString(string strName, bool sqlSafeCheck)
        {
            if (HttpContext.Current.Request.QueryString[strName] == null)
                return "";

            if (sqlSafeCheck && !IsSafeSqlString(HttpContext.Current.Request.QueryString[strName]))
                return "unsafe string";

            return HttpContext.Current.Request.QueryString[strName];
        }

public static bool IsSafeSqlString(string str)
        {
            return !Regex.IsMatch(str, @"[-|;|,|\/|\(|\)|\[|\]|\}|\{|%|@|\*|!|\']");
        }

public static int GetQueryInt(string strName, int defValue)
        {
            return StrToInt(HttpContext.Current.Request.QueryString[strName], defValue);
        }

public static int StrToInt(string expression, int defValue)
        {
            if (string.IsNullOrEmpty(expression) || expression.Trim().Length >= 11 || !Regex.IsMatch(expression.Trim(), @"^([-]|[0-9])[0-9]*(\.\w*)?$"))
                return defValue;

            int rv;
            if (Int32.TryParse(expression, out rv))
                return rv;

            return Convert.ToInt32(StrToFloat(expression, defValue));
        }

public static float StrToFloat(string expression, float defValue)
        {
            if ((expression == null) || (expression.Length > 10))
                return defValue;

            float intValue = defValue;
            if (expression != null)
            {
                bool IsFloat = Regex.IsMatch(expression, @"^([-]|[0-9])[0-9]*(\.\w*)?$");
                if (IsFloat)
                    float.TryParse(expression, out intValue);
            }
            return intValue;
        }

public static string CombUrlTxt(string _url, string _keys, params string[] _values)
        {
            StringBuilder urlParams = new StringBuilder();
            try
            {
                string[] keyArr = _keys.Split(new char[] { '&' });
                for (int i = 0; i < keyArr.Length; i++)
                {
                    if (!string.IsNullOrEmpty(_values[i]) && _values[i] != "0")
                    {
                        _values[i] = UrlEncode(_values[i]);
                        urlParams.Append(string.Format(keyArr[i], _values) + "&");
                    }
                }
                if (!string.IsNullOrEmpty(urlParams.ToString()) && _url.IndexOf("?") == -1)
                    urlParams.Insert(0, "?");
            }
            catch
            {
                return _url;
            }
            return _url + DelLastChar(urlParams.ToString(), "&");
        }

public static string UrlEncode(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                return "";
            }
            str = str.Replace("'", "");
            return HttpContext.Current.Server.UrlEncode(str);
        }

//刪除最後結尾的指定字元後的字元

public static string DelLastChar(string str, string strchar)
        {
            if (string.IsNullOrEmpty(str))
                return "";
            if (str.LastIndexOf(strchar) >= 0 && str.LastIndexOf(strchar) == str.Length - 1)
            {
                return str.Substring(0, str.LastIndexOf(strchar));
            }
            return str;
        }

//返回分頁頁碼

public static string OutPageList(int pageSize, int pageIndex, int totalCount, string linkUrl, int centSize)
        {
            //計算頁數
            if (totalCount < 1 || pageSize < 1)
            {
                return "";
            }
            int pageCount = totalCount / pageSize;
            if (pageCount < 1)
            {
                return "";
            }
            if (totalCount % pageSize > 0)
            {
                pageCount += 1;
            }
            if (pageCount <= 1)
            {
                return "";
            }
            StringBuilder pageStr = new StringBuilder();
            string pageId = "__id__";
            string firstBtn = "<a href=\"" + ReplaceStr(linkUrl, pageId, (pageIndex-1).ToString()) + "\">上一頁»</a>";
            string lastBtn = "<a href=\"" + ReplaceStr(linkUrl, pageId, (pageIndex + 1).ToString()) + "\">下一頁»</a>";
            string firstStr = "<a href=\"" + ReplaceStr(linkUrl, pageId, "1") + "\">1</a>";
            string lastStr = "<a href=\"" + ReplaceStr(linkUrl, pageId, pageCount.ToString()) + "\">" + pageCount.ToString() + "</a>";

            if (pageIndex <= 1)
            {
                firstBtn = "<span class=\"disabled\">«上一頁</span>";
            }
            if (pageIndex >= pageCount)
            {
                lastBtn = "<span class=\"disabled\">下一頁»</span>";
            }
            if (pageIndex == 1)
            {
                firstStr = "<span class=\"current\">1</span>";
            }
            if (pageIndex == pageCount)
            {
                lastStr = "<span class=\"current\">" + pageCount.ToString() + "</span>";
            }
            int firstNum = pageIndex - (centSize / 2); //中間開始的頁碼
            if (pageIndex < centSize)
                firstNum = 2;
            int lastNum = pageIndex + centSize - ((centSize / 2) + 1); //中間結束的頁碼
            if (lastNum >= pageCount)
                lastNum = pageCount - 1;
            pageStr.Append("<span>共" + totalCount + "記錄</span>");
            pageStr.Append(firstBtn + firstStr);
            if (pageIndex >= centSize)
            {
                pageStr.Append("<span>...</span>\n");
            }
            for (int i = firstNum; i <= lastNum; i++)
            {
                if (i == pageIndex)
                {
                    pageStr.Append("<span class=\"current\">" + i + "</span>");
                }
                else
                {
                    pageStr.Append("<a href=\"" + ReplaceStr(linkUrl, pageId, i.ToString()) + "\">" + i + "</a>");
                }
            }
            if (pageCount - pageIndex > centSize - ((centSize / 2)))
            {
                pageStr.Append("<span>...</span>");
            }
            pageStr.Append(lastStr + lastBtn);
            return pageStr.ToString();
        }

public static string ReplaceStr(string originalStr, string oldStr, string newStr)
        {
            if (string.IsNullOrEmpty(oldStr))
            {
                return "";
            }
            return originalStr.Replace(oldStr, newStr);
        }

public static string GetCookie(string strName, string key)
        {
            if (HttpContext.Current.Request.Cookies != null && HttpContext.Current.Request.Cookies[strName] != null && HttpContext.Current.Request.Cookies[strName][key] != null)
                return UrlDecode(HttpContext.Current.Request.Cookies[strName][key].ToString());

            return "";
        }

public static string UrlDecode(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                return "";
            }
            return HttpContext.Current.Server.UrlDecode(str);
        }

public static void WriteCookie(string strName, string key, string strValue, int expires)
        {
            HttpCookie cookie = HttpContext.Current.Request.Cookies[strName];
            if (cookie == null)
            {
                cookie = new HttpCookie(strName);
            }
            cookie[key] = UrlEncode(strValue);
            cookie.Expires = DateTime.Now.AddMinutes(expires);
            HttpContext.Current.Response.AppendCookie(cookie);
        }

}

 

Bussiness

命名空間

 public class Business
    {
        private readonly DAL.xxx xxxDal;

public Business()
        {
            xxxDal = new DAL.xxx();

  }

public List<Model.xxx> GetList(int pageSize, int pageIndex, string strWhere, string filedOrder, out int recordCount,out decimal totalIncome)
        {
            return xxxDal.GetList(pageSize, pageIndex, strWhere, filedOrder, out recordCount,out totalIncome);
        }

}

 

DAL

命名空間

public partial class xxx
{

public List<Model.xxx> GetList(int pageSize, int pageIndex, string strWhere, string filedOrder, out int recordCount,out decimal totalIncome)
        {
            totalIncome = 0;
            StringBuilder strSql = new StringBuilder();
            strSql.Append(@"select a.oid,ocreatetime,a.oaccname,a.oacctel,(select ucardnum from AppUser where uid=a.ouid) as ucardnum,c.pname,
                            otype,ISNULL(b.corealmoney,0) as corealmoney,ISNULL(b.cooid,0) as cooid,
                            omoney,ISNULL(coprate,0) coprate,ISNULL(codrawfee,0) codrawfee,ISNULL(codowndrawfee,0) codowndrawfee,ISNULL(d.uname,'無') as uname,
                             ISNULL(b.couserrate,0) as couserrate,
                            ROW_NUMBER() over(order by ocreatetime desc) r from xxx a left join
                            (select cooid,coprate,comoney,corealmoney,codowndrawfee,codrawfee,couupperid,couserrate from xxx where costatus=1)b
                            on a.oid=b.cooid join xxx c on a.opid=c.pid
                            left join xxx d on b.couupperid=d.[uid] where a.ostatus=1 ");
            if (strWhere.Trim() != "")
            {
                strSql.Append(strWhere);
            }
            using (var context = DataBaseConnection.GetSdkBaseConnection())
            {
                recordCount = context.ExecuteScalar<int>(PagingHelper.CreateCountingSql(strSql.ToString()));
                if (recordCount > 0)
                {
                    StringBuilder strSql2 = new StringBuilder();
                    strSql2.Append(@"select SUM(corealmoney) from xxx a left join
                                    (select cooid,coprate,corealmoney,codowndrawfee,comoney,codrawfee,couupperid,couserrate from xxx where costatus=1)b
                                    on a.oid=b.cooid join xxx c on a.opid=c.pid
                                    left join xxx d on b.couupperid=d.[uid] where a.ostatus=1 ");
                    if (strWhere.Trim() != "")
                    {
                        strSql2.Append(strWhere);
                    }
                }
                return context.Query<Model.xxx>(PagingHelper.CreatePagingSql(recordCount, pageSize, pageIndex, strSql.ToString(), filedOrder)).ToList();
            }
        }

}

PagingHelper

命名空間

// ROW_NUMBER高效率分頁(僅支持MSSQL2005及以上)

public static class PagingHelper
 {

// 獲取分頁SQL語句,預設row_number為關健字,所有表不允許使用該欄位名

public static string CreatePagingSql(int _recordCount, int _pageSize, int _pageIndex, string _safeSql, string _orderField)
        {
            //計算總頁數
            _pageSize = _pageSize == 0 ? _recordCount : _pageSize;
            int pageCount = (_recordCount + _pageSize - 1) / _pageSize;

            //檢查當前頁數
            if (_pageIndex < 1)
            {
                _pageIndex = 1;
            }
            else if (_pageIndex > pageCount)
            {
                _pageIndex = pageCount;
            }
            //拼接SQL字元串,加上ROW_NUMBER函數進行分頁
            StringBuilder newSafeSql = new StringBuilder();
            newSafeSql.AppendFormat("SELECT ROW_NUMBER() OVER(ORDER BY {0}) as row_number,", _orderField);
            newSafeSql.Append(_safeSql.Substring(_safeSql.ToUpper().IndexOf("SELECT") + 6));

            //拼接成最終的SQL語句
            StringBuilder sbSql = new StringBuilder();
            sbSql.Append("SELECT * FROM (");
            sbSql.Append(newSafeSql.ToString());
            sbSql.Append(") AS T");
            sbSql.AppendFormat(" WHERE row_number between {0} and {1}", ((_pageIndex - 1) * _pageSize) + 1, _pageIndex * _pageSize);

            return sbSql.ToString();
        }
        // 獲取記錄總數SQL語句
        public static string CreateCountingSql(string _safeSql)
        {
            return string.Format(" SELECT COUNT(1) AS RecordCount FROM ({0}) AS T ", _safeSql);
        }

}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 異常處理 1、在異常處理中,如果子類覆蓋了父類的一個方法,子類方法中聲明的已檢查異常不能比父類方法聲明的異常更通用,即子類方法可以拋出更特定的異常(不超過父類方法聲明的異常範圍,即由父類方法聲明異常派生的子異常),或者不拋出任何異常。並且,如果父類方法沒有拋出異常,子類也不能拋出任何已檢查異常。 個 ...
  • 代碼: ...
  • 原作者介紹,在Android上如何運用Anko和Kotlin開發資料庫。 ...
  • 故事背景: 很久很久以前(2017.6.5,文章有其時效性,特別是使用的工具更新換代頻發,請記住這個時間,若已經沒有價值,一切以工具官方文檔為準),下了個mysql版本玩玩,剛好最新是mysql5.7.18,本機是win10、64位系統。大抵步驟分為: 1、下載:以官網(https://www.my ...
  • 這是因為yum安裝了舊版本的GPG key造成的,解決辦法: rpm --import /etc/pki/rpm-gpg/RPM* Header V3 DSA/SHA1 Signature, key ID解決辦法: rpm -ivh vnc-server-4.1.2-14.el5_5.4.i386. ...
  • 在 Linux 操作系統下,幾乎所有的軟體均通過RPM 進行安裝、卸載及管理等操作。RPM 的全稱為Redhat Package Manager ,是由Redhat 公司提出的,用於管理Linux 下軟體包的軟體。Linux 安裝時,除了幾個核心模塊以外,其餘幾乎所有的模塊均通過RPM 完成安裝。R ...
  • 本篇和大家分享的是一個磁碟文件查看系統,嚴格來說是使用NetCore寫的一個Web系統應用,由於NetCore跨平臺特性,我生成了exe的運行包,只需要配置運行電腦ip+埠,即可在瀏覽器中通過IP+埠的方式訪問目標調用上的所有目錄,不錯是所有目錄(如果您有:C,D,E,F盤都可以訪問),當然為了 ...
  • 前言 目前我們做m端時都會用到定位,當用戶第一次打開h5頁面時會啟動gps定位,並結合百度map來查找城市。按照我們的邏輯思路就是gps定位獲取經緯度,傳到後臺調用百度的一個介面查找城市名稱。 1、查詢得到城市名稱,我們根據城市名稱在我們自己的資料庫里再查詢對應的城市id(查詢會很頻繁,可以基於xm ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...