牛腩中,当我们的新闻数据很少时,完全可以在一页显示,而且也不会破坏界面的布局,但当数据很多的时候,就会影响页面的布局,而且用户等待时间就会加长,试想谁会愿意一直在等待呢?我们就必须想办法来解决这个问题。
一种方法为假分页,另一种方法为真分页。
假分页:
将数据库中数据全部取出来之后,在显示的时候分页显示,这样当数据库中数据量很多的时候就会一直等待。
实现假分页的代码。
/// <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之前,如图所示:
这一番奋斗之后,终于实现了真假分页,真假分页实际上就是我们是否从根源解决问题,真分页从源头解决了问题,假分页只是从表相来实现了。真分页在之后的网页设计中还会遇到,多实践才能多发现,一起向前奋斗吧。