在机房收费系统中,有很多次用到了DataGridView控件来以表格的形式显示数据库中的信息。在牛腩中则是用到了GridView,两个控件的属性功能有很多相似的地方。但是如果数据库中的东西比较多的时候,GridView控件则显得有点力不从心,而且一味的按列的形式排数据,也会造成网页DIV样式的改变,这时就用到了分页。
分页就是将数据库中的数据分成若干个页面显示出来,分为两种方式,一是假分页,二是真分页。
一、假分页:先将数据库中的数据都取出来,再分页显示给用户。
利用GridView控件进行假分页,需要先设置它的属性,将AllowPaging属性设置为True,也就是允许分页的意思;然后设置PageSize属性,即每页显示的数据条数,根据个人想法设置。分页之后即显示下标1和2:
这时如果直接点击下标2则会出错,因为它的点击事件是没有功能实现的。所以,还应该给它加上一个事件:
<span style="font-family:KaiTi_GB2312;font-size:18px;">/// <summary>
/// 当页面的索引改变时,则显示其他页面数据,并重新绑定数据源
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void gvNewNews_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvNewNews.PageIndex = e.NewPageIndex;
//重新绑定数据源
NewsManager nm = new NewsManager();
gvNewNews.DataSource = nm.SelectNewNews();
gvNewNews.DataBind();
}</span>
这样再点击2则会跳转到第二页:
到此为止,假分页的功能也就实现完成了。
二、真分页:真分页就是在取数据库的数据时就直接以每页多少行数据的形式取出,然后分页显示给用户。真分页需要用到一个空间,也就是ASPNETPage分页控件。
下载ASPNETPAGE分页控件,直接将DLL组件加载到VS中,就可以在界面上拖出控件。同样,它也需要设置PageSize来显示每页有几条数据。
用分页控件分页时,需要知道每页是从第几条数据到第几条数据。先做一个测试,在一个界面上拖入该控件,设置PageSize属性为5,给出如下代码
<span style="font-family:KaiTi_GB2312;font-size:18px;">/// <summary>
/// 页面加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
anpNewsList.RecordCount = 40;
}
/// <summary>
/// 当改变页数时执行的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void anpNewsList_PageChanged(object sender, EventArgs e)
{
//开始和结束数据行
Response.Write("开始记录:" + anpNewsList.StartRecordIndex + "<br>" + "结束记录:" + anpNewsList.EndRecordIndex);
}</span>
这时点击控件上的2,就会显示
如果要让数据显示,则是要绑定数据源,这时就需要用到每一页的开始记录数和结束记录数,在数据库查询字符串中传入参数,就可以特定的取出第几行到第几行的数据来作为每一页的数据,这样就实现了真分页。
在特定选出数据库表中的第几行到第几行,在数据库中也有配套的函数,那就是ROW_NUMBER,具体的使用方法大致是,将数据库表放在一个虚拟表中,加上表示行号的一列,然后通过参数的传入来选择行号,显示给用户,具体用法还有待研究。
编辑:
对于真分页的实现代码,视频当中是没有提到的,不过视频当中讲了实现的思想。经过三个小时的研究,终于把代码实现了。
D层:
/// <summary>
/// 选择所有新闻
/// </summary>
/// <returns></returns>
public DataTable SelectNews(int start,int end)
{
DataTable dt=new DataTable ();
string sql="news_SelectAll";
SqlParameter [] paras=new SqlParameter []{
new SqlParameter ("@start",start ),
new SqlParameter ("@end",end)
};
dt=new SQLHelper ().ExecuteQuery (sql,paras, CommandType.StoredProcedure );
return dt;
}
/// <summary>
/// 选择全部新闻
/// </summary>
/// <returns></returns>
public DataTable SelectAll()
{
DataTable dt = new DataTable();
string sql = "select * from news";
dt = new SQLHelper().ExecuteQuery(sql,CommandType.Text );
return dt;
}
其中的news_SelectAll是写的一个存储过程,
CREATE PROCEDURE news_SelectAll
@start int,
@end int
AS
BEGIN
with temp as (
select ROW_NUMBER () over(order by id desc) as 行号,* from news
)
select * from temp where 行号 between @start and @end
END
GO
当然,它也可以直接在D层用SQL语句来实现,这里就不写出来代码了。
界面层:
NewsManager nm = new NewsManager();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataTable dt = new DataTable();
dt = nm.SelectAll();
anpNewsList.RecordCount =dt.Rows .Count ;
BindNews();
}
}
private void BindNews()
{
int start = anpNewsList.StartRecordIndex;
int end = anpNewsList.EndRecordIndex;
DataTable dt = nm.SelectNews(start, end);
//绑定新闻列表
gvNews.DataSource = dt;
gvNews.DataBind();
}
/// <summary>
/// 页面更改的时候,GridView控件分页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void anpNewsList_PageChanged(object sender, EventArgs e)
{
BindNews();
}
这样就真正的实现了真分页,效果如下:
比较
假分页相对来说代码简单,甚至不用写代码可能就能实现,但是适用的数据量比较少;真分页虽然代码相对复杂,但是适用的数据量是非常庞大的!!不同的情况用不同的分页方法,让它更好的为我们服务!!
总结
做项目会遇见各种问题,不过很巧的是,碰到的问题总是能以某种方式去解决,就好像冥冥之中安排好一样,你应该遇见什么样的问题,应该以什么样的方式解决,都在固定的时间以固定的方式提供给你,只要自己去用去学去练习。