臨近年關,越多越多的園友開始了對工作、生活的總結,以及對來年目標的確立。這很勵志,人是一根能思想的葦草,想來想去,我實在沒什么驚天地、泣鬼神的英勇事跡,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也好,很少有手動書寫分頁控件的情況,多數公司也都有自己獨立封裝的控件,即使沒有,也多為直接引用網上比較成熟的分頁控件,學校教材教授的那些方法,實際上外面幾乎是不用的。
----- 市人皆大笑 舉手揶揄之
文章列表