DataList分页

 转载::深刻研究DataList分页方法sql

2008-03-20 12:59 by 萧别离, 7684 visits, 网摘, 收藏, 编辑
此文章转至http://www.tobrush.com/archives/617301(隋心所欲)
 
从Asp.net 1.1开始,咱们就开始使用DataGrid、DataList、Repeater控件,到了Asp.net 2.0又增长了
GridView控件。GridView控件在DataGrid上作了优化和改进,功能很强大,可是自定义性不够强。
Repeater自定义性很是高。而DataList则兼而有之,其余方面本文不谈。这里就说下怎么给DataList分
页。
给DataList分页有两个办法:1   、本身写二、用第三方控件(如AspNetPager)
使用第三方控件的方法我就不说了,这里主要说说如何本身实现分页方法。
个人DataList分页方法的核心原理是利用PagedDataSource对象,PagedDataSource类封装了DataGrid 
  控件的属性,这些属性使DataGrid 能够执行分页,下面是PagedDataSource的公共属性:
AllowCustomPaging 获取或设置指示是否启用自定义分页的值。
AllowPaging 获取或设置指示是否启用分页的值。
Count 获取要从数据源使用的项数。
CurrentPageIndex 获取或设置当前页的索引。
DataSource 获取或设置数据源。
DataSourceCount 获取数据源中的项数。
FirstIndexInPage 获取页中的第一个索引。
IsCustomPagingEnabled 获取一个值,该值指示是否启用自定义分页。
IsFirstPage 获取一个值,该值指示当前页是不是首页。
IsLastPage 获取一个值,该值指示当前页是不是最后一页。
IsPagingEnabled 获取一个值,该值指示是否启用分页。
IsReadOnly 获取一个值,该值指示数据源是不是只读的。
IsSynchronized 获取一个值,该值指示是否同步对数据源的访问(线程安全)。
PageCount 获取显示数据源中的全部项所须要的总页数。
PageSize 获取或设置要在单页上显示的项数。
VirtualCount 获取或设置在使用自定义分页时数据源中的实际项数。
  那么如何使用PagedDataSource对象进行DataList分页呢?(网上有不少的讲DataList分页的文章,有
一些是糊弄人的,有的还没法起做用,我被骗过一次,本文是我通过我的实践经验获得,能够顺利执行。
但愿对你们有所帮助。)如今开始拉!
第一步,取出数据到        datatable        中,而后得到        dataview   ,付给        PagedDataSource        对象   
DataView objView = objTable.DefaultView;
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = objView;
第二步,   PagedDataSource        对象        objPds        的设置   
objPds.AllowPaging = true;
objPds.PageSize = 4;
objPds.CurrentPageIndex = int.Parse(ViewState[“pageindex”].ToString());
上面的这两段代码都是写在BindData()函数中的,供每次点击分页按钮时调用。BindData()函数如
下:
private void BindData()
{
string sql = “SELECT * From team”;
DataTable objTable = data.GetDataTable(sql);
if (objTable != null && objTable.Rows.Count > 0)
{
DataView objView = objTable.DefaultView;
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = objView;
objPds.AllowPaging = true;
objPds.PageSize = 4;
objPds.CurrentPageIndex = int.Parse(ViewState[”pageindex”].ToString());
if (!objPds.IsFirstPage)
{
lkPre.Visible = true;
}
else
{
lkPre.Visible = false;
}if (!objPds.IsLastPage)
{
lkNext.Visible = true;
}
else
{
lkNext.Visible = false;
}
dlData.DataSource = objPds;
dlData.DataBind();
}
}
blockquote>
到此为止,咱们已经将数据交给了PagedDataSource,剩下的分页将利用PagedDataSource 进行处
理。可能你们注意到了,这个数据交付是完整的数据交付,若是数据量很大会形成必定的效率低下,
不过这里暂时不考虑这个问题。有兴趣的朋友能够一块儿探讨一下。
  上面的第三行代码中的ViewState[“pageindex”] 是用来控制PagedDataSource的当前页的,咱们在
Page_Load   事件中和第三步将要将的函数中来具体讲解如何利用ViewState[“pageindex”]控制当前
页。
BindData()函数中后面的部分是控制向前向后按钮的显隐的,再也不多说。
第三步,分页控制
  第二步中说过利用ViewState[“pageindex”] 来控制当前页,为了在页面加载的时候就显示第一页,
咱们固然要在Page_load   事件中将ViewState[“pageindex”]置为0。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState[“pageindex”] = “0″;
BindData(); }
}
咱们须要加两个按钮(Previous、Next)来点击进行分页控制。
<asp:DataList ID=”dlData” runat=”server” RepeatColumns=”4″ >
<ItemTemplate>
<asp:Label ID=”lblName” runat=”server” /><br />
<asp:Label ID=”lblTime” runat=”server” /></ItemTemplate>
</asp:DataList>
<asp:linkbutton ID=”lkPre” OnCommand=”IndexChanging” CommandArgument=”pre” runat=”se
rver” >PREVIOUS PAGE></asp:linkbutton>
<asp:linkbutton ID=”lkNext” OnCommand=”IndexChanging” CommandArgument=”next” runat=
”server” >NEXT PAGE</asp:linkbutton>
两个按钮的 OnCommand都是IndexChanging()函数,咱们经过CommandArgument(pre和
next)来区分究竟是向前翻仍是向后翻。下面是IndexChanging()函数
protected void IndexChanging(object sender, EventArgs e)
{
string strCommand = ((LinkButton)sender).CommandArgument.ToString();
int pageindex = int.Parse(ViewState[“pageindex”].ToString());
if (strCommand == “pre”)
{
pageindex = pageindex - 1;
}
else
{
pageindex = pageindex + 1;
}
ViewState[“pageindex”] = pageindex;
BindData();
}
至此,咱们的分页函数已经写完了。这里还有一些东西没有说,好比显示一共多少条记录,当前第
几页,一共多少页以及每一页的页码。相信看懂了上面所说的后这些东西仍是容易写出来的。
总结一下,咱们在前台写好DataList等待数据,而数据是由PagedDataSource提供的,分页经过我
们新加的两个ImageButton来控制ViewState进而达到控制PagedDataSource的CurrentPageIndex
来实现的。因此,其实DataList也没干啥事,就是显示了每一页的数据而已。有一点须要说明,
PagedDataSource的CurrentPageIndex是从0开始的,这也是为何在Page_load事件中要讲
ViewState置为0而不是1的缘故。
OK “ ” 了~听着周杰伦的 阳光宅男 写完了这篇blog   ,但愿对你们有所帮助。
相关文章
相关标签/搜索