面對幾十條的資料,網頁都會顯示特別慢,如果面對上千上萬條的記錄時,網頁就不知道慢成什麼樣子了,此時系統就可以說報廢了。今天我們從本質上將分頁問題解決掉。
例子:
<p style="height: 23px; width:700px; text-align: center;font-size:16px;" background="images/相簿_09.jpg"> 當前頁碼為[<asp:Label ID="lblCurrentPage" runat="server" Text="1"></asp:Label>]頁 總頁碼[<asp:Label ID="lblSumPage" runat="server" Text="0"></asp:Label>]頁 <asp:LinkButton ID="lnkBtnFirst" runat="server" Font-Underline="False" OnClick="lnkBtnFirst_Click"> 第一頁 </asp:LinkButton> <asp:LinkButton ID="lnkBtnPrevious" runat="server" Font-Underline="False" OnClick="lnkBtnPrevious_Click"> 上一頁 </asp:LinkButton> <asp:LinkButton ID="lnkBtnNext" runat="server" Font-Underline="False" OnClick="lnkBtnNext_Click"> 下一頁 </asp:LinkButton> <asp:LinkButton ID="lnkBtnLast" runat="server" Font-Underline="False" OnClick="lnkBtnLast_Click"> 末一頁 </asp:LinkButton> </p>
protected void Page_Load(object sender, EventArgs e) { //如果使用者沒有登入,則跳轉到首頁 if (Session["UserName"] != null) { DataListBind(); } else { Response.Redirect("default.aspx"); } } ///// <summary> ///// 綁定目前使用者的照片 ///// </summary> public void DataListBind() { //判斷使用者是否已經登入 if (Session["UserID"] == null) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('您尚未登入,請登入!');</script>"); return; } DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("PhotoID", typeof(string))); dt.Columns.Add(new DataColumn("PhotoName", typeof(string))); dt.Columns.Add(new DataColumn("PhotoUrl", typeof(string))); dt.PrimaryKey = new[] { dt.Columns["PhotoID"] }; //執行個體化一個B層對象 userPhotoBLL userphotobll = new userPhotoBLL(); //執行個體化一個實體的對象 userPhotoEntity enUserPhoto = new userPhotoEntity(); enUserPhoto.UserID = Session["UserID"].ToString();//擷取目前使用者的ID string strWhere = "UserID='" + enUserPhoto.UserID + "'"; //根據查詢條件獲得資料列表 DataSet ds = userphotobll.GetList(strWhere); //如果沒有記錄,則顯示一張空照片 if (ds.Tables[0].Rows.Count == 0) { NoImage.Visible = true; } else { NoImage.Visible = false; } for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { if (ds.Tables[0].Rows.Count > 0) { DataRow dr = dt.NewRow(); dr[0] = ds.Tables[0].Rows[i][1].ToString(); dr[1] = ds.Tables[0].Rows[i][2].ToString(); dr[2] = ds.Tables[0].Rows[i][5].ToString(); dt.Rows.Add(dr); } } PagedDataSource pds = new PagedDataSource(); pds.DataSource = dt.DefaultView; //將查詢結果綁定到分頁資料來源上。 pds.AllowPaging = true; //允許分頁 pds.PageSize = 12; //設定每頁顯示多少張圖片 pds.CurrentPageIndex = Convert.ToInt32(lblCurrentPage.Text) - 1; //設定當前頁 lnkBtnFirst.Enabled = true; //控制項翻頁控制項都設定為可用 lnkBtnLast.Enabled = true; lnkBtnNext.Enabled = true; lnkBtnPrevious.Enabled = true; if (lblCurrentPage.Text == "1") //如果當前顯示第一頁,“第一頁”和“上一頁”按鈕不可用。 { lnkBtnPrevious.Enabled = false; lnkBtnFirst.Enabled = false; } if (lblCurrentPage.Text == pds.PageCount.ToString()) //如果顯示最後一頁,“末一頁”和“下一頁”按鈕不可用。 { lnkBtnNext.Enabled = false; lnkBtnLast.Enabled = false; } lblSumPage.Text = pds.PageCount.ToString(); //實現總頁數 //將分頁結果綁定到DataList控制項上 dlPictrue.DataSource = pds; //綁定資料來源 dlPictrue.DataKeyField = "PhotoID"; dlPictrue.DataBind(); } /// <summary> /// 第一頁 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void lnkBtnFirst_Click(object sender, EventArgs e) { lblCurrentPage.Text = "1"; DataListBind(); } /// <summary> /// 前一頁 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void lnkBtnPrevious_Click(object sender, EventArgs e) { lblCurrentPage.Text = (Convert.ToInt32(lblCurrentPage.Text) - 1).ToString(); DataListBind(); } /// <summary> /// 下一頁 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void lnkBtnNext_Click(object sender, EventArgs e) { lblCurrentPage.Text = (Convert.ToInt32(lblCurrentPage.Text) + 1).ToString(); DataListBind(); } /// <summary> /// 最後一頁 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void lnkBtnLast_Click(object sender, EventArgs e) { lblCurrentPage.Text = lblSumPage.Text; DataListBind(); }
<webdiyer:AspNetPager ID="anp" runat="server" FirstPageText="首頁" LastPageText="尾頁" NextPageText="下一頁" onpagechanged="anp_PageChanged" PageSize="12" PrevPageText="上一頁" CustomInfoHTML="總共%RecordCount%條記錄,共%PageCount%頁" ShowCustomInfoSection="Left" ShowPageIndexBox="Never" CssClass="paginator" CurrentPageButtonClass="cpb" AlwaysShow="True" CustomInfoSectionWidth=""> </webdiyer:AspNetPager>
protected static PagedDataSource pds = new PagedDataSource();//建立一個分頁資料來源的對象且一定要聲明為靜態 paintingBLL paintingbll = new paintingBLL(); protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //第一次進入該頁面時 //載入所有的書畫作品 string strWhereRecord = ""; //獲得資料總數 anp.RecordCount = paintingbll.GetRecordCount(strWhereRecord); //調用綁定的方法 BindGV(); //載入所有的最新訂單 //賦值 string strWhere = "DoSign='成交'"; string filedOrder = "DealTime"; //綁定資料來源 gvPaintOrder.DataSource = new OrderFormBLL().GetList(10, strWhere, filedOrder); gvPaintOrder.DataBind(); } } //分頁事件 protected void anp_PageChanged(object sender, EventArgs e) { BindGV(); } //綁定書畫 protected void BindGV() { string strWhere=""; string orderby=""; //頁大小 int pagesize = anp.PageSize; //頁索引 int pageindex = anp.CurrentPageIndex; //執行個體化一個B層對象 paintingBLL paintingbll = new paintingBLL(); //獲得所有的書畫資料,開始索引值 (pageindex - 1) * pagesize + 1,結束索引值:pagesize * pageindex DataSet ds = paintingbll.GetListByPage(strWhere, orderby, (pageindex - 1) * pagesize + 1, pagesize * pageindex); //如果沒有記錄,則顯示沒有條 if (ds.Tables[0].Rows.Count == 0) { NoImage.Visible = true; } else { NoImage.Visible = false; } pds.DataSource = ds.Tables[0].DefaultView;//把資料集中的資料放入分頁資料來源中 dlPictrue.DataSource = pds;//綁定Datalist dlPictrue.DataBind(); }
/// <summary>/// 擷取記錄總數/// </summary>public int GetRecordCount(string strWhere){StringBuilder strSql=new StringBuilder(); strSql.Append("select count(1) FROM V_PaintingInfo ");if(strWhere.Trim()!=""){strSql.Append(" where "+strWhere);}object obj = DbHelperSQL.GetSingle(strSql.ToString());if (obj == null){return 0;}else{return Convert.ToInt32(obj);}}/// <summary>/// 分頁擷取資料列表/// </summary>public DataSet GetListByPage(string strWhere, string orderby, int startIndex, int endIndex){StringBuilder strSql=new StringBuilder();strSql.Append("SELECT * FROM ( ");strSql.Append(" SELECT ROW_NUMBER() OVER (");if (!string.IsNullOrEmpty(orderby.Trim())){strSql.Append("order by T." + orderby );}else{ strSql.Append("order by T.PaintingID ASC");} strSql.Append(")AS Row, T.* from V_paintingInfo T ");if (!string.IsNullOrEmpty(strWhere.Trim())){strSql.Append(" WHERE " + strWhere);}strSql.Append(" ) TT");strSql.AppendFormat(" WHERE TT.Row between {0} and {1}", startIndex, endIndex);return DbHelperSQL.Query(strSql.ToString());}
假分頁,如果資料量較多,在首次頁面載入的時候會比較慢,嚴重影響使用者體驗,Web開發和搜尋引擎最佳化。真分頁的效率無疑是最高的,它還有很多的優點:
1.每次點擊下一頁,Client Access Server的時間基本一樣,提高使用者體驗,更加的人性化。
2.對於大資料量可以從容的面對。
缺點:與背景互動次數增多。
;真分頁:。