文章出處

     臨近年關,越多越多的園友開始了對工作、生活的總結,以及對來年目標的確立。這很勵志,人是一根能思想的葦草,想來想去,我實在沒什么驚天地、泣鬼神的英勇事跡,16年畢業季,按部就班的在時間的馬車上顛簸,閱讀了幾本動物書,趕上大雨,趟著大腿深的積水去公司,一點也不夸張,政府后來還連夜搭鐵橋,最后上升到炸湖泄洪,最后雨水終退去。閑言少敘,下面來介紹學時未曾深入理解的分頁那些事。

      分頁不分真假,技術不論貴賤,存在即合理,只是在特定的時間下特定的情況里發揮著各自的作用,僅此而已。

1. 代碼未動,數據先行。先建立一個Student表,來存儲數據(當然也可以使用Code first,這里僅作說明)

USE [IBCC]
GO

/****** Object:  Table [dbo].[Student]    Script Date: 2016/12/25 21:09:48 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Student](
    [StudentID] [int] NOT NULL,
    [StudentName] [nchar](10) NULL,
    [StudentClass] [nchar](10) NULL,
 CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED 
(
    [StudentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

 

 2.控件分頁,利用GridView控件,手動選擇綁定數據源,勾選分頁功能,由于非常基礎,一鍵鼠標設置,我這里只貼出效果圖

 

好吧,我承認確實沒什么技術含量,作為一位已走出校園的程序員,是不屑于使用這種方法的。

3.簡潔分頁,就是所謂的 ‘假’ 分頁,試用對象,表中數據不多

   內部實現:每次操作均將表中數據全部查出,然后顯示目的頁

   ①.前端模板,定義樣式(PS:模板來源網絡)

    <div>
        <asp:GridView ID="GridV1" runat="server" PageSize="4" AllowPaging="true" OnPageIndexChanging="GridV1_PageIndexChanging">
             <PagerTemplate>
                當前第:          
                <asp:Label ID="LabelCurrentPage" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageIndex + 1 %>"></asp:Label>/共:            
                <asp:Label ID="LabelPageCount" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageCount %>"></asp:Label><asp:LinkButton ID="LinkButtonFirstPage" runat="server" CommandArgument="First" CommandName="Page"
                    Visible='<%#((GridView)Container.NamingContainer).PageIndex != 0 %>'>首頁</asp:LinkButton>
                <asp:LinkButton ID="LinkButtonPreviousPage" runat="server" CommandArgument="Prev"
                    CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'>上一頁</asp:LinkButton>        
                <asp:LinkButton ID="LinkButtonNextPage" runat="server" CommandArgument="Next" CommandName="Page"
                    Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>下一頁</asp:LinkButton>
                <asp:LinkButton ID="LinkButtonLastPage" runat="server" CommandArgument="Last" CommandName="Page"
                    Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>尾頁</asp:LinkButton>
                轉到第<asp:TextBox ID="txtNewPageIndex" runat="server" Width="20px" Text="<%# ((GridView)Container.NamingContainer).PageIndex + 1 %>" /><%----這里將CommandArgument即使點擊該按鈕e.newIndex 值為3 --%>
                <asp:LinkButton ID="btnGo" runat="server" CausesValidation="False" CommandArgument="-2"
                    CommandName="Page" Text="GO" OnClientClick="return textInt()"/>
            </PagerTemplate>
        </asp:GridView>
    </div>

 

對于以上分頁模板,只需要記住 ((GridView)Container.NamingContainer) 表示GridView控件本身,其余就不難理解

   PageIndex表示當前索引頁

   PageCount加載控件后的數據總頁數

以上模板的設置可以處理首頁、上一頁、下一頁、尾頁功能

 ②.綁定數據,由于頁面第一次加載和每次操作分頁控件時,都是對數據的操作,所以最好是將其寫在一個方法中,以便調用

  private void BindList() 
   {
     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["IBBCConnectionString"].ToString());
SqlDataAdapter sda
= new SqlDataAdapter("SELECT * FROM IBCC.dbo.Student", con); con.Open(); DataSet ds = new DataSet(); sda.Fill(ds, "Temp"); GridV1.DataSource = ds.Tables["Temp"]; GridV1.DataBind(); con.Close(); }

 ③.處理跳轉頁,有時候執行跳轉頁,所填數字過大,或者不合法,對于這些情況,都需要進行處理,為了減少系統執行的復雜度,選擇前臺處理

    <script type="text/javascript">
        function textInt() {
            var reg = new RegExp("^[0-9]*$");
            var num = document.getElementById("GridV1_txtNewPageIndex");
            //得到控件總頁數
            var count = document.getElementById("GridV1_LabelPageCount").innerHTML;
            //判斷是否為數字
            if (!reg.test(num.value)) {
                alert("not a number");
                return false;
            }
            else {
                num.value = parseInt(num.value) > parseInt(count) ? parseInt(count) : parseInt(num.value);
                num.setAttribute("value", num.value);             
            }
        }
    </script>

 ④.后臺處理邏輯跳轉。給控件執行分頁的操作設定索引頁,非常簡單

  protected void GridV1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {  
      //獲得控件對象
      GridView grid = sender as GridView;
      //當前索引頁
      if (e.NewPageIndex<0)
      {
        grid.PageIndex=int.Parse(((TextBox)GridV1.BottomPagerRow.FindControl("txtNewPageIndex")).Text) - 1;
      }
      else
      {
        grid.PageIndex = e.NewPageIndex;
      }         
       BindList();
    }

 所有步驟完成,進行調試,如下:

 

 所謂的假分頁寫到這里,有幾個地方需要注意一下:

  ①前臺獲取asp控件時,有時候獲取不到id,這個時候一般處理的方法有兩種,一是運行程序,查看編譯后該控件的id,例如,原來gridview1的id為txtNewPageIndex,運行程序經過HTML編譯后變GridV1_txtNewPageIndex,多為加控件前綴;二是設置ASP控件時,增加ClientIDMode="Static",此時進行在運行項目,經HTML編譯就不會更改該控件前綴,至于該屬性的其他值,可以參考微軟提供的信息

 

4. 邏輯分頁。就是所謂的真分頁,適用于數據量大,不頻繁執行分頁操作

    內部實現,將查詢的頁數當作參數傳遞給后臺的SQL,進行分頁,而不是全部查出

    原理稍稍變化,僅此而已

    有時候可能遇到前臺只顯示部分列的情況,這個時候,需要在前臺稍稍做一下處理,比如,如果使用 Repeater 控件來顯示數據,設置如下

 <asp:Repeater ID="Repeater1" runat="server">
    <HeaderTemplate>
        <table  border="1" cellspacing="0" cellpadding="0">
            <tr>
                <th>編號</th>                      
                <th>日期</th>
                <th>名稱</th>
                <th>地址</th>
             </tr>
    </HeaderTemplate>
    <ItemTemplate>
           <tr >
               <td><%#DataBinder.Eval(Container.DataItem,"CUST_ID")%></td>                     
               <td><%# ((System.Data.DataRowView)Container.DataItem)["JCIC_DATE"] %></td>                   
               <td><%#Eval("C_NAME")%></td>
               <td><%#Eval("ADDRESS")%></td>
           </tr>
    </ItemTemplate>
</asp:Repeater>

注:上圖中"CUST_ID" 等列名一定要與數據庫中的名字相同,其上的三種寫法都是一樣的效果

 

5.引用開源控件,網上開源的分頁控件有很多,如:MVC分頁控件Webform分頁控件

   MVC 引用分頁控件,楊濤再其網站的說明文檔中已有示例,這里簡要記錄幾個關鍵點

   ① 安裝NVC分頁控件的 Nuget 包,微軟的網有是很卡,我這里要稍稍吐槽下長城的網,卡的不行,一直都是安裝失敗,非得開VPN不可

   ② 控制器界面引用 using Webdiyer.WebControls.Mvc;

   ③ 視圖界面引用 @model PagedList<TableName> ,視圖文件只允許使用一個@model,如果創建的是強類型視圖,最上面 @model IEnumerable<>需注銷

    就目前開發而言,MVC也好,Webform也好,很少有手動書寫分頁控件的情況,多數公司也都有自己獨立封裝的控件,即使沒有,也多為直接引用網上比較成熟的分頁控件,學校教材教授的那些方法,實際上外面幾乎是不用的。

----- 市人皆大笑 舉手揶揄之

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()