新闻系统——真假分页
牛腩中,当我们的新闻数据很少时,完全可以在一页显示,而且也不会破坏界面的布局,但当数据很多的时候,就会影响页面的布局,而且用户等待时间就会加长,试想谁会愿意一直在等待呢?我们就必须想办法来解决这个问题。
一种方法为假分页,另一种方法为真分页。
假分页:
将数据库中数据全部取出来之后,在显示的时候分页显示,这样当数据库中数据量很多的时候就会一直等待。
实现假分页的代码。
/// <summary> /// 点击下一页 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gvHotNews_PageIndexChanging(object sender, GridViewPageEventArgs e) { gvHotNews.PageIndex = e.NewPageIndex; NewsManager nm = new NewsManager(); gvHotNews.DataSource = nm.SelectNewNews(); gvHotNews.DataBind(); }代码很简单,但是必须在web中添加这个事件(红字部分),否则无法触发该方法:
<asp:GridView ID="gvNewNews" runat="server" AutoGenerateColumns="False" BorderWidth="0" GridLines="None" AllowPaging="True" <span style="color:#ff0000;">OnPageIndexChanging ="gvNewNews_PageIndexChanging" </span> PageSize="5">真分页:
顾名思义,就是直接从数据库中取出该页面显示的新闻,当跳转到下一页再取出该页所需要的数据,这样就实现了真正的分页,从源头来解决问题。
1、添加AspNetPager控件(需要下载)、
2、添加.dll文件,并且添加到工具箱中
3、实现
Web
<span style="font-family:KaiTi_GB2312;"> 界面: <webdiyer:AspNetPager ID="anp" runat="server" FirstPageText ="首页" LastPageText ="尾页" NextPageText ="下一页" PrevPageText ="上一页" OnPageChanged ="anp_PageChanged" PageSize ="5" AlwaysShow ="true" > </webdiyer:AspNetPager></span>
<span style="font-family:KaiTi_GB2312;">实现 protected void Page_Load(object sender, EventArgs e) { //已登录 if (!Page.IsPostBack) { DataTable dt = new DataTable(); dt = nm.SelectAll(); anp.RecordCount = dt.Rows.Count; BindNews(); } }</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"> //绑定新闻列表 public void BindNews() { int start = anp.StartRecordIndex; int end = anp.EndRecordIndex; repNews.DataSource = new NewsManager().SelectPage(start,end ); repNews.DataBind(); }</span>
D层
<span style="font-family:KaiTi_GB2312;">/// <summary> /// 新闻分页显示 /// </summary> /// <param name="start"></param> /// <param name="end"></param> /// <returns></returns> public DataTable SelectPage(int start, int end) { DataTable dt = new DataTable(); string cmdText = "news_selectPage"; SqlParameter[] paras = new SqlParameter[]{ new SqlParameter ("@start",start ), new SqlParameter ("@end",end) }; dt = sqlhelper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure ); return dt; }</span>存储过程:
<span style="font-family:KaiTi_GB2312;">CREATE PROCEDURE [dbo].[news_selectPage] @start integer, @end integer AS BEGIN SET NOCOUNT ON; with tempt as ( SELECT ROW_NUMBER() over (order by id desc )as row, * from news T) SELECT * FROM tempt where row between @start and @end END GO</span>接下来直接B层来调用D层,只要写一个方法就可以了,这里不再详细写了。下面是显示效果:
在这之中会出现一个问题:
经过查阅资料——AspNetPager分页示例—配合UpdatePanel实现无刷新分页看了代码之后,终于找到原因,将ScriptManager添加到UpdatePanel之前,如图所示:
这一番奋斗之后,终于实现了真假分页,真假分页实际上就是我们是否从根源解决问题,真分页从源头解决了问题,假分页只是从表相来实现了。真分页在之后的网页设计中还会遇到,多实践才能多发现,一起向前奋斗吧。