日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析ASP.NET高效分頁的實現(xiàn)過程

本文要實現(xiàn)的是以上一頁和下一頁的方式實現(xiàn)的ASP.NET高效分頁,至于以1、2、3、4這樣的形式顯示的ASP.NET高效分頁,還有待于作者的進(jìn)一步研究ASP.NET高效分頁后實現(xiàn)。

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計制作、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)寧波,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

簡單、高效這是我們追求的分頁效果。

現(xiàn)在有三種很常見的分頁:

1、分頁用的html和后臺代碼都自己寫 ,設(shè)計和代碼一般都只對應(yīng)某個網(wǎng)頁,難以在其他頁面很好的重用

2、最簡單的當(dāng)然是數(shù)據(jù)控件自帶的分頁功能,他的那些缺陷已經(jīng)被討論很多年了,我就不重復(fù)了,相信稍微有點魄力和職業(yè)態(tài)度的程序員都不會用那個分頁

3、自制的分頁控件,可以實現(xiàn)代碼和設(shè)計的分離,可以在多個頁面重用控件,但是缺陷是:每個頁面都得調(diào)用控件而且還要在頁面的后臺代碼里初始化控件,例如向控件里傳送總頁數(shù)、當(dāng)前分頁序號、頁面大小等

綜合以上分析,我打算自己做個簡單的分頁控件,思路如下:

1、首先必須實現(xiàn)分頁時代碼和設(shè)計的分離,例如“下一頁”,“上一頁”,他們的樣式寫在一個文件里,而把控制他們怎么顯示寫在另一個文件里,例如,到了最后一頁,“最后一頁”這個按鈕不能用。所以我寫了個template.html文件,這個描述了分頁時的樣式

 
 
 
  1. Code
  2. >
  3.  xmlns="http://www.w3.org/1999/xhtml">
  4.     
  5.      style="width: 100%; height: 30px; overflow: hidden; clear: both; font-size: 12px;" id="MyPagingString{10}">
  6.          style="float: left; width: 50px; line-height: 20px; text-align: center; height: 20px;
  7.             border: 1px solid #d8dfea; margin-left: 15px; cursor: pointer; display: {0}"
  8.             onmouseover="p.on({1},this)" onmouseout="p.out({1},this)" onclick="p.direct({1},'first','{10}')">
  9.             第一頁
  10.         
  •          style="float: left; width: 50px; line-height: 20px; text-align: center; height: 20px;
  •             border: 1px solid #d8dfea; margin-left: 15px; cursor: pointer; display: {0}"
  •             onmouseover="p.on({2},this)" onmouseout="p.out({2},this)" onclick="p.direct({2},'previous','{10}')">
  •             上一頁
  •         
  •          style="float: left; width: 50px; line-height: 20px; text-align: center; height: 20px;
  •             border: 1px solid #d8dfea; margin-left: 15px; cursor: pointer; display: {0}"
  •             onmouseover="p.on({3},this)" onmouseout="p.out({3},this)" onclick="p.direct({3},'next','{10}')">
  •             下一頁
  •         
  •          style="float: left; width: 65px; line-height: 20px; text-align: center; height: 20px;
  •             border: 1px solid #d8dfea; margin-left: 15px; cursor: pointer; display: {0}"
  •             onmouseover="p.on({4},this)" onmouseout="p.out({4},this)" onclick="p.direct({4},'end','{10}',{11})">
  •             最后一頁
  •         
  •          style="float: left; height: 20px; line-height: 20px; margin-left: 20px; display: {9}">
  •             每頁記錄: style=" color:Red;">{5}  當(dāng)前頁:  style=" color:red;">{6}  總頁數(shù):  style=" color:Red;">{7}  總記錄數(shù):  style=" color:Red;">{8}
  •         
  •     
  •     
  • 當(dāng)程序第一次加載時,從硬盤讀取分頁模板文件template.html并且放入緩存,如果第二次有分頁請求時就從緩存讀取,
    如果,template.html,被修改則再次從硬盤讀取,類似asp.net里的配置文件讀取機制,

    緩存代碼如下:

     
     
     
    1. Code
    2. public static string GetPageHtml()
    3.     {
    4.         pagingHtml = (string)(HttpContext.Current.Cache["paging"]);
    5.         if (string.IsNullOrEmpty(pagingHtml))
    6.         {
    7.             string path = null;
    8.             CacheDependency cd;
    9.             path = GetPagingTemplePath();
    10.             cd = new CacheDependency(path);
    11.             ReadPagingHtmlsFromDisk(path);   
    12.             HttpContext.Current.Cache.Insert("paging", pagingHtml, cd);
    13.         }
    14.         return pagingHtml;
    15.     }

    2、對數(shù)據(jù)源的獲取的sql實現(xiàn)了優(yōu)化,下面是兩種常用的分頁語句,第二條語句的優(yōu)勢在于:

    not in 會引起全表掃描,而且不會使用聚集索引,而第二條語句沒有這樣的缺陷

     
     
     
    1. select top size  * from table where id not in (select top  index*size id from table )
    2. lect top size  * from table where id > (select max (id) from (select top  index*size id from tableas T )

    對用戶輸入的sql語句,例如“select * from table”自動優(yōu)化成上面的第二種格式

    下面這個方法實現(xiàn)了復(fù)雜sql語句轉(zhuǎn)化

     
     
     
    1. Code
    2. public static string AnalyticsSql(string sql, int index, int size)
    3.     {
    4.         string keyid = null, columns = null, table = null, orderby = null, wherestr = null, originalSql = null;
    5.         originalSql = sql;
    6.         originalSql = originalSql.Replace(originalSql.Substring(originalSql.IndexOf(" select ") + 8, originalSql.IndexOf(" from ") - 8 - originalSql.IndexOf(" select ")), " count(*) ");
    7.         if (sql.IndexOf(" * ") != -1)
    8.         {
    9.             if (sql.IndexOf("|") != -1)
    10.             {
    11.                 keyid = sql.Substring(sql.IndexOf("|") + 1, sql.IndexOf(" ", sql.IndexOf("|")) - sql.IndexOf("|") - 1);
    12.             }
    13.             else
    14.             {
    15.                 keyid = "id";
    16.             }
    17.             columns = "*";
    18.         }
    19.         else
    20.         {
    21.             keyid = sql.Substring(sql.IndexOf("select") + 6, sql.IndexOf(",") - sql.IndexOf("select") - 6);
    22.             columns = sql.Substring(sql.IndexOf("select") + 6, sql.IndexOf(" from ") - 6 - sql.IndexOf("select"));
    23.         }
    24.         if (sql.IndexOf(" where ") != -1)
    25.         {
    26.             wherestr = " where ";
    27.             if (sql.IndexOf(" order ") != -1)
    28.                 wherestr += sql.Substring(sql.IndexOf(" where ") + 7, sql.IndexOf(" order ") - sql.IndexOf(" where ") - 7);
    29.             else
    30.                 wherestr += sql.Substring(sql.IndexOf(" where ") + 7);
    31.         }
    32.         table = GetSqlTable(sql);
    33.         if (sql.IndexOf(" order ") != -1)
    34.         {
    35.             orderby = sql.Substring(sql.LastIndexOf("by") + 2);
    36.         }
    37.         else
    38.         {
    39.             orderby = keyid;
    40.         }
    41.         sql = "select top " + size.ToString() + " " + columns + " from " + table + " where  " + keyid + ">isnull((select max (" + keyid + ") from (select top " + (index * size).ToString() + " " + keyid.ToString() + " from " + table + wherestr + " order by " + orderby + ") as T),0) order by " + keyid;
    42.         return originalSql + ";" + sql;
    43.     }

    需要補充的是分頁排序時id問題:

    如果你的SQL語句寫成了這樣:

     
     
     
    1. 1、select * from table where ... order ...
    2. 則優(yōu)化后的sql以id排序
    3. 2、select *|CustomerId from table where ... order ...
    4. 則優(yōu)化后的sql以CustomerId排序
    5. 2、select CustomerId,CustomerName,... from table where ... order ...
    6. 則優(yōu)化后的sql以CustomerId排序 
    7. ================================== 

    然后根據(jù)當(dāng)前信息格式化分頁顯示的htmls,例如,頁數(shù)、頁號、總記錄數(shù)、以及上下頁按鈕是否可用。具體代碼:

     
     
     
    1. Code
    2.    public static string AnalyticsPagingHtmls(string tableAndindex,int count, int size, int index)
    3.     {
    4.         string _GetPageHtml = GetPageHtml();
    5.         return string.Format
    6.             (
    7.             _GetPageHtml.Substring(0, _GetPageHtml.IndexOf(",{4}];") + 6),
    8.             count == 0 || count <= size ? "none" : "",
    9.             index == 0 ? "0" : "1",
    10.             index == 0 ? "0" : "1",
    11.             (index + 1 == ((count % size) == 0 ? count / size : ((count / size) + 1))) ? "0" : "1",
    12.             (index + 1 == ((count % size) == 0 ? count / size : ((count / size) + 1))) ? "0" : "1",
    13.             size,
    14.             index + 1,
    15.             (count % size) == 0 ? count / size : (count / size) + 1,
    16.             count,
    17.             count == 0 ? "none" : "",
    18.             tableAndindex,
    19.             ((count % size) == 0 ? count / size : ((count / size) + 1))-1
    20.             )
    21.             + _GetPageHtml.Substring(_GetPageHtml.IndexOf(",{4}];") + 6);
    22.     }

     如何使用這個分頁方法:

    第一步:在配置文件里寫下如下代碼:

     
     
     
    1. Code
    2.   
    3.      name="MyPaging" type="System.Configuration.NameValueSectionHandler"/>
    4.   
    5.   
    6.    key="Paging" value="~/Paging/template.htm"/>
    7.   

     第二步:在cs文件里,直接調(diào)用就行

     
     
     
    1. protected void Page_Load(object sender, EventArgs e)
    2.     {
    3.         if(MyPaging.IsPaging)
    4.         {
    5.             p1.InnerHtml = MyPaging.ExecutePaging(MyRep, "select CustomerId,ShipName,ShipAddress,ShippedDate from orders ", 0,5);
    6.             p2.InnerHtml = MyPaging.ExecutePaging(MyRep2, "select CustomerID,CompanyName,ContactName,Address from dbo.Customers", 0,5);
    7.         }
    8.     }

    前臺代碼:

     
     
     
    1. Code
    2. <%@ Page Language="C#"   AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    3. >
    4.  xmlns="http://www.w3.org/1999/xhtml">
    5.  runat="server">
    6.     
    7.      id="form1" runat="server">
    8.      ID="MyRep" runat=server>
    9.     
    10.      style="width:100%; height:20px;">
    11.     <%# Eval("CustomerID") %>
    12.     <%# Eval("ShipName") %>
    13.     <%# Eval("ShipAddress") %>
    14.     <%# Eval("ShippedDate")%>
    15.     
  •     
  •     
  •      id="p1" runat=server>
  •     
  •       ID="MyRep2" runat=server>
  •     
  •      style="width:100%; height:20px;">
  •     <%# Eval("CustomerID")%>
  •     <%# Eval("CompanyName")%>
  •     <%# Eval("ContactName")%>
  •     <%# Eval("Address")%>
  •     
  •     
  •     
  •      id="p2" runat=server>
  •     
  • 實現(xiàn)效果:

    鏈接:http://www.cnblogs.com/chenxumi/archive/2009/11/05/1596777.html


    網(wǎng)站標(biāo)題:淺析ASP.NET高效分頁的實現(xiàn)過程
    路徑分享:http://www.dlmjj.cn/article/dphipds.html