关于ASP.NET分页技术

杨友山
博客专家认证
2011-09-06 03:21:21
各位高手们,
关于分页的,我刚刚用了一个AspNetPager的控件的分页,这个是需要把所有数据全部读取出来,一次性加载,是个假的分页。但是这用起来很简单。

我接下来有个数据很多的表,我看了下别人写的分页,原理就是选页数,根据总条数和该页显示的条数算出要从什么地方读取一定的数据。简直太复杂了,在aspx上写了n个a标签,提交之后还要不停地判断,这有些不好啊。

那么有没有稍微简单些的分页,一定是实时读取的,但是也不要很复杂,最好是控件形式的,这样其他人看代码也方便一些的的呢,等待中... ...
...全文
569 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
LMAOhuaNL 2011-09-07
  • 打赏
  • 举报
回复
杨友山 2011-09-07
  • 打赏
  • 举报
回复
实在不好意思,分有些少,而且这个给分的看不清。

问题解决了,用的是liuchaolin 提示的那种方式,其余的哪几种方式,我要保留着以备不时之需,谢谢啦!
xiongxyt2 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 anchenyanyue 的回复:]
SQL code

CREATE PROC procPaging
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize ……
[/Quote]
一般都用存储过程
w654271590 2011-09-06
  • 打赏
  • 举报
回复
利用强类型Dataset实现高效率分页,添加俩个sql方法,一个为查处总条数,一个为页数,再将其绑定到Listview空间上,稍微修改一下listview空间就OK了,我认为这很简单!
杨友山 2011-09-06
  • 打赏
  • 举报
回复
复杂,是指在aspx页面写很多,而用AspNetPager控件只要读出一个dataset就OK,至于选页什么的,根本不用在页面算出来,控件自己就搞定了。
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 avgod 的回复:]
据我所知,分页主要在业务处理上...跟界面控件没什么关系.
主要是存储过程中的处理...
[/Quote]

更加昏倒!

界面要告诉业务处理部分“需要的页号以及每一页多少记录”,不然业务处理怎么按照记录“开始行数、总行数”来查询数据呢?
  • 打赏
  • 举报
回复
[Quote=引用楼主 yysyangyangyangshan 的回复:]
我接下来有个数据很多的表,我看了下别人写的分页,原理就是选页数,根据总条数和该页显示的条数算出要从什么地方读取一定的数据。简直太复杂了[/Quote]

我昏倒!

用户选择页号,而你算出从什么记录数开始,不过是一个乘法运算而已,这还“太复杂了”啊!
杨友山 2011-09-06
  • 打赏
  • 举报
回复
为啥反而用不成了,只能看到第一页,后面没有,注释了才可以
杨友山 2011-09-06
  • 打赏
  • 举报
回复
好了,确实可以按页码分,我是按 liuchaolin
的方法整的,但是我想问下 之前我用的

//DataTable dt = new DataTable();
//dt = ds.Tables["dsSource"];
//PagedDataSource page = new PagedDataSource();
//page.DataSource = dt.DefaultView as DataView;
//page.AllowPaging = true;
//page.PageSize = AspNetPager1.PageSize;
Lucenedonet 2011-09-06
  • 打赏
  • 举报
回复
楼主,我告诉你吧,我做web开发的,这个用的很熟悉了。难得不敢说都会,简单的还是会的。

你看看这个就会了

http://www.webdiyer.com/Controls/AspNetPager

是要多少读取多少,不是一次全读取出来,要是全读取出来,1千万行的表,那不是把网站搞死?

其实本质上就是用SQL语句或者指定行到指定行的数据,为了提高性能,你可以写个存储过程,这样的存储过程网上太多了。

其次重要的是要记住当前的状态,点击下一页的时候不至于弄错。

aspnetpager已经做得很完美了。
nlx0201 2011-09-06
  • 打赏
  • 举报
回复
其实分页也就一句SQL语句的问题,传入参数:pageindex,count等等
AVGod 2011-09-06
  • 打赏
  • 举报
回复
据我所知,分页主要在业务处理上...跟界面控件没什么关系.
主要是存储过程中的处理...
接分为押宝 2011-09-06
  • 打赏
  • 举报
回复
AspNetPager控件可以做分页的,
对查询的sql语句进行分页操作就行。
md5e 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liuchaolin 的回复:]
学东西不能太死版的,AspNetPager本身就很好用了

C# code

/// <summary>
/// 获取记录数
/// </summary>
/// <param name="table"></param>
/// <param name="cond">格式:Where ...</param>
……
[/Quote]

这个就是在AspNetPager之上开发的

AspNetPager1.RecordCount = GetRowCount("gl_NewsSystem", cond);

rp_datalist.DataSource = GetinfoList("gl_NewsSystem", AspNetPager1.CurrentPageIndex, AspNetPager1.PageSize, " OrderID DESC,FBDate DESC,id DESC", cond);

_chenlianjia 2011-09-06
  • 打赏
  • 举报
回复
在gridview里添加:
<PagerTemplate>
<div style="font-size: 12px; text-align: right">
<asp:LinkButton ID="btnFirstUser" runat="server" CommandArgument="First" CommandName="Page"
Enabled="<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>" Text="First"> </asp:LinkButton>
<asp:LinkButton ID="btnPrevUser" runat="server" CommandArgument="Prev" CommandName="Page"
Enabled="<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>" Text="Preview"> </asp:LinkButton>
<asp:LinkButton ID="btnNextUser" runat="server" CommandArgument="Next" CommandName="Page"
Enabled="<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>"
Text="Next"> </asp:LinkButton>
<asp:LinkButton ID="btnLastUser" runat="server" CommandArgument="Last" CommandName="Page"
Enabled="<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>"
Text="Last"> </asp:LinkButton>
<asp:Label ID="LblTotalRecordsUser" runat="server" Text="Records:"> </asp:Label>
<asp:Label ID="LblRecordCountUser" runat="server" ForeColor="Red"></asp:Label>
<asp:Label ID="LblTotalPagesUser" runat="server" Text="Pages:"></asp:Label>
<asp:Label ID="LblPageCountUser" runat="server" ForeColor="Red" Text='<%# (((GridView)Container.NamingContainer).PageCount) + " "%>'></asp:Label><asp:Label
ID="LblPageUser" runat="server" Text="Page:"></asp:Label>
<asp:Label ID="LblCurrentIndexUser" runat="server" ForeColor="Red" Text='<%# (((GridView)Container.NamingContainer).PageIndex + 1) + " " %>'></asp:Label><asp:Label
ID="lblzUser" runat="server" Text="GoTo"></asp:Label>
<asp:DropDownList ID="dropNumUser" runat="server" AppendDataBoundItems="True" AutoPostBack="True"
OnSelectedIndexChanged="dropNumTask_SelectedIndexChanged">
</asp:DropDownList>
<asp:Literal ID="LiteralEvery" runat="server" Text="Every"></asp:Literal>
<asp:DropDownList ID="dropCountUser" runat="server" AppendDataBoundItems="True" AutoPostBack="True"
OnSelectedIndexChanged="dropCountTask_SelectedIndexChanged">
<asp:ListItem Text="50" Value="50"></asp:ListItem>
<asp:ListItem Text="100" Value="100"></asp:ListItem>
<asp:ListItem Text="150" Value="150"></asp:ListItem>
</asp:DropDownList>
<asp:Literal ID="LiteralOnePage" runat="server" Text="One Page"></asp:Literal>
</div>
</PagerTemplate>

然后再objectdatasource里配置一些东西:(具体看看后面的后台代码:老师介绍的,很管用)

实现的后台代码:
#region 分页
protected void dropNumTask_SelectedIndexChanged(object sender, EventArgs e)
{
GridViewPageEventArgs ea = new GridViewPageEventArgs((sender as DropDownList).SelectedIndex);
GV_ShowTopbillData.SelectedIndex = -1;
GV_ShowTopbillData_PageIndexChanging(null, ea);
}

protected void GV_ShowTopbillData_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GV_ShowTopbillData.PageIndex = e.NewPageIndex;
GV_ShowTopbillData.SelectedIndex = -1;
GV_ShowTopbillData.DataBind();
}

protected void dropCountTask_SelectedIndexChanged(object sender, EventArgs e)
{
GV_ShowTopbillData.PageSize = Convert.ToInt32((sender as DropDownList).SelectedValue);
GV_ShowTopbillData.DataBind();
}

protected void GV_ShowTopbillData_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Pager)
{
System.Web.UI.WebControls.Label lblUsersCount = e.Row.FindControl("LblRecordCountUser") as System.Web.UI.WebControls.Label;
if (ViewState["TasksCount"] != null)
{
lblUsersCount.Text = ViewState["TasksCount"].ToString();
}
DropDownList ddl = e.Row.FindControl("dropNumUser") as DropDownList;
DropDownList ddlCount = e.Row.FindControl("dropCountUser") as DropDownList;
ddlCount.Items.FindByValue(GV_ShowTopbillData.PageSize.ToString()).Selected = true;
System.Web.UI.WebControls.Label lblPageCount = e.Row.FindControl("LblPageCountUser") as System.Web.UI.WebControls.Label;
System.Web.UI.WebControls.Label lblCurrentPage = e.Row.FindControl("LblCurrentIndexUser") as System.Web.UI.WebControls.Label;
ddl.Items.Clear();
for (int i = 1; i <= Convert.ToInt32(lblPageCount.Text.Trim()); i++)
{
ddl.Items.Add(i.ToString());
}
ddl.Items.FindByText(lblCurrentPage.Text.Trim()).Selected = true;
}
}
/*获取数据数目*/
protected void ODS_TopbillData_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
if (e.ReturnValue != null)
ViewState["TasksCount"] = (e.ReturnValue as List<TopbillList>).Count.ToString();
}
/*令底部按钮不消失*/
protected void GV_ShowTopbillData_DataBound(object sender, EventArgs e)
{
if (GV_ShowTopbillData.Rows.Count != 0)
GV_ShowTopbillData.BottomPagerRow.Visible = true;
}
#endregion
杨友山 2011-09-06
  • 打赏
  • 举报
回复
我还是想用控件,AspNetPager到底怎样获取,当前点的是哪一页呢,获取不到啊
hao110706 2011-09-06
  • 打赏
  • 举报
回复
我最近也用到过AspNetPager这个控件来实现分页,其实实现分页很简单完全,我的思路是这样的,如果你用了三层框架结构搭建项目的话很简单哦,在DAL这一层对应的cs类中写一个根据主键获取数据表中的数据条数public int getDataCount()和public DataSet getDataList(int iCurrentPageIndex, int iPageSize, string strCondition)方法,然后在你的页面后台中写AspNetPager1.pagecount=BLL.getDataCount();再写个private void BindData(int pageIndex,string Condition, ref int count){DataSet ds = BLL.getDataList(AspNetPager1.CurrentPageIndex - 1, AspNetPager1.PageSize, Condition);数据显示的控件(GridView,DataList,Repeater).DataSource=ds;数据控件. DataBind();}方法,在 protected void Page_Load(object sender, EventArgs e){if(!IsPostBack){string Condition= "数据显示的额外条件";int count = 0;BindData(0,Condition, ref count);AspNetPager1.RecordCount = count;}}在 protected void AspNetPager1_PageChanged(object sender, EventArgs e)int count = 0;BindData(AspNetPager1.CurrentPageIndex - 1, ref count);}这样就OK了!你试试吧!慢慢来,不要着急,思路理清了,程序写起来就容易多了!!
qin_0 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 yuandongze 的回复:]

引用 27 楼 lucenedonet 的回复:
楼主,你好痴噢。

你用过分页吗?

你是不是刚毕业的学生呀!


你不是从刚毕业过来的?
[/Quote]


就是,就是
杨友山 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 lucenedonet 的回复:]
楼主,你好痴噢。

你用过分页吗?

你是不是刚毕业的学生呀!
[/Quote]

在学校用过,不过这两年到真么用过,俺一直写的是应用程序,涉及到的数据最多就7万,根本不用分页,两万条数据直接显示到xptable上,最近要搞软件的后台才用到分页的。
和永恒有關 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 lucenedonet 的回复:]
楼主,你好痴噢。

你用过分页吗?

你是不是刚毕业的学生呀!
[/Quote]

你不是从刚毕业过来的?
加载更多回复(27)

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧