asp.net2.0中Repeater的分頁使用

在.net中提供了多種分頁方法,但使用最多而入門又比較容易的恐怕就非DataGrid(1.0)或GridView莫屬了,這兩種控件在使用時確實是非常的方便,基本上不需要寫代碼就搞定了,尤其是GridView。但這兩種控件也有使用不方便之處,比如一個由web2.0定義的前臺頁面里加入GridView很是麻煩,特別是像我這樣的菜鳥。^_^而經過使用了幾種控件後我還是選擇了Repeater,這個控件用法非常簡單,有點像asp裏面的分頁的那種感覺(只是比喻一下,並不是誤導各位說.net沒有asp好,這兩個還是不能相提並論的!!);在使用Repeater時只要在需要循環的位置加入:

<Repeater id="infolist" runat="server>
<ItemTemplate>
這裏就是需要循環的內容了....
</ItemTemplate>
</Repeater>
這樣就可以了,很方便吧,這樣的話既使頁面再怎麼複雜也不會受到影響了,而且我在2.0中發現Repeater還可以嵌套,用起來真的挺自由的。雖然Repeater在前臺使用比較靈活自由,但有一個問題就是Repeater不支持直接分頁,這個很多人看起來就有點不想用了,但我想大家都知道GridView控件或DataGrid控件在啓用自帶分頁的時候其實效率是非常低的,大的不說,一但到了百萬級數據以後,就會感覺是多麼的痛苦和無耐了,所以既使是使用DataGrid(GridView)控件,高手們還是隻會只使用一個界面而已,而分頁肯定都是自己寫的,這樣一比較利弊就出來了,既然這樣那就選擇Repeater吧,我在這裏正好結合一下效率還算可以的雙top分頁法一起使用,對付百萬級的數據量是足夠了(如果還不夠的話那你只能另想他法或生成靜態了)

其實雙top的原理非常簡單,其實就是一句Sql語句,一看就明白!

    TimeSpan newtimespan = DateTime.Now.TimeOfDay;//運行時間開始
        int pagesize = 20;
        
int cpage = Convert.ToInt32(page);
        
string sql="";
        
string sqlstr = "select count(*) from komain_vote";
        SqlConnection myConnection 
= new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
        SqlCommand myCommand 
= new SqlCommand(sqlstr, myConnection);
        myConnection.Open();
        
int totalput = Convert.ToInt32(myCommand.ExecuteScalar());

        
int maxpage = 1;
        
if (totalput % pagesize == 0)
        {
            maxpage 
= totalput / pagesize;
        }
        
else
        {
            maxpage 
= totalput / pagesize + 1;
        }
        
if (maxpage == 0) { maxpage = 1; }
        
if (cpage < 1) { cpage = 1; }
        
else if (cpage > maxpage) { cpage = maxpage; }

        
if (totalput != 0)
        {
            
if (cpage == 1)
            {
                sql 
= "select top " + pagesize + " * from komain_vote order by id desc";
            }
            
else
            {
                sql 
= "select top " + pagesize + " * from komain_vote where id not in(select top " + (cpage - 1* pagesize + " id from komain_vote order by id desc) order by id desc";
            }
        }

        SqlDataAdapter mysda 
= new SqlDataAdapter(sql, myConnection);
        DataSet myds 
= new DataSet();
        mysda.Fill(myds);
        mysda.Dispose();


        
this.Label1.Text = "共有信息" + totalput.ToString() + "條  當前是第" + cpage.ToString() + "/" + maxpage.ToString() + "頁  ";
            
if(cpage!=1){
                
this.HyperLink1.Text="首頁";
                
this.HyperLink1.NavigateUrl="vote.aspx?page=1";
                
this.HyperLink2.Text="上一頁";
                
this.HyperLink2.NavigateUrl="vote.aspx?page="+Convert.ToString(cpage-1);}
            
else{
                
this.HyperLink1.Text="首頁";
                
this.HyperLink2.Text="上一頁";
            }
            
if(cpage!=maxpage){
                
this.HyperLink3.Text="下一頁";
                
this.HyperLink3.NavigateUrl="vote.aspx?page="+Convert.ToString(cpage+1);
                
this.HyperLink4.Text="尾頁";
                
this.HyperLink4.NavigateUrl="vote.aspx?page="+maxpage.ToString();}

          

            
this.votelist.DataSource = myds.Tables[0].DefaultView;
            
this.votelist.DataBind();
            runtime.Text 
= DateTime.Now.TimeOfDay.Subtract(newtimespan).TotalMilliseconds.ToString();//算出運行時間並附值給Label控件(runtime)

雖然看上去挺多的,但我是直接從vs裏複製出來的,所有的東西都比較全了,只是核心的話就一小段。

核心語句:sql = "select top " + pagesize + " * from komain_vote where id not in(select top " + (cpage - 1) * pagesize + " id from komain_vote order by id desc) order by id desc";

但我在這句的上頁加了一句(sql = "select top " + pagesize + " * from komain_vote order by id desc";)
這樣的話我覺得會有提高一點效率的功能,也就是說當前頁是第一頁的時候就不用再去計算分頁過程了,直接讀取20條數據就行了(在這裏我定義的是每頁顯示20條數據)

但這樣的話效率還不是非常高,相必都知道分頁中其實統計數據所佔的時間是比較長的,尤其是數據量非常大的時候,雖然count(*)已經很快了,但我給大家提個建議:“在數據庫裏新建一個表或xml文件,專門用來放統計信息數量的,這樣的話數據總數據就可以直接從數據庫或xml文件中讀取了,比統計來說那是快了不少(我在這裏說的都是針對大形數據庫的,如果本身的數據量都不超過1000就沒這個必要了)

注:我在自己的老本本上用一百萬條數據作測試,發現最快的時候在前幾百頁可以達到10~60毫秒之間,既使是翻到了最後一頁也只用了不到700毫秒,這個速度還算是比較理想吧,必竟我的本本太老了。^_^
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章