自定义GridView分页模板中页码Button的实现

第一次使用ASP.NET,遇到的问题实在太多了,前几天想要实现GridView中的分页效果,知道了自带的PagerSettings功能,但是发现它不能同时有上下页和页码的功能,后来知道了PagerTemplate自定义模板的功能,根据以下文章的方法进行了设置:

    自定义GridView分页模板

代码如下:可以利用linkbutton 的参数commandargument和commandname来实现上下页和首尾页的功能。

  
  <PagerTemplate>
<table width="100%">
<tr>
<td style="text-align: right">
<asp:Label ID="lblPageIndex" runat="server" Text='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 %>' />页
共/
<asp:Label ID="lblPageCount" runat="server" Text='<%# ((GridView)Container.Parent.Parent).PageCount %>' />页
<asp:LinkButton ID="btnFirst" runat="server" CausesValidation="False" CommandArgument="First"
CommandName
="Page" Text="首页" />
<asp:LinkButton ID="btnPrev" runat="server" CausesValidation="False" CommandArgument="Prev"
CommandName
="Page" Text="上一页" />
<asp:LinkButton ID="btnNext" runat="server" CausesValidation="False" CommandArgument="Next"
CommandName
="Page" Text="下一页" />
<asp:LinkButton ID="btnLast" runat="server" CausesValidation="False" CommandArgument="Last"
CommandName
="Page" Text="尾页" />
<asp:TextBox ID="txtNewPageIndex" runat="server" Width="20px" Text='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 %>' />
<asp:LinkButton ID="btnGo" runat="server" CausesValidation="False" CommandArgument="-1"
CommandName
="Page" Text="GO" /><!-- here set the CommandArgument of the Go Button to '-1' as the flag -->
</td>
</tr>
</table>
</PagerTemplate>

     但是还是没有页码的按钮,然后我用了如下的方法,在模板中用FOR添加了多个commandargument为数字的linkbutton 。这样在效果上是有了页码按钮了,可是点击的参数总是为空的,也就是说CommandArgument="<%=i+1 %>" 中不可以用<%=%>来调用i的值,可是使用Response.Write的方法有不可以写asp的控件,那如何可以将这个页号的参数传到后台呢?

Code
。。。
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandArgument="Prev" CommandName="Page" Text="上一页" />
<% for (int i = 0; i <= this.grvPage.PageCount; i++)
{
if (i == this.grvPage.PageIndex)
Response.Write(
"<span style='background-color:Blue; color:#ffffff'>" + (i+1) + "</span>");
else %>
<asp:LinkButton runat="server" CausesValidation="False" CommandArgument="<%=i+1 %>" CommandName="Page" ><%=i+1 %></asp:LinkButton>
<% Response.Write("&nbsp;");
}
%>
<asp:LinkButton ID="btnNext" runat="server" CausesValidation="False" CommandArgument="Next" CommandName="Page" Text="下一页" />
。。。

     呵呵,当然,最后还是没有找到方法。不过这里用了另外的一种方法实现了效果,就是页面GET(QueryString)传数据的方法。下面是效果图。

 

下面是代码,功能除实现了页码按钮外,还对上下页及首尾页按钮的状态也进行了控制。 

  
  <%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
protected
void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string pageno
= (string)Request.QueryString["pageno"];
string pagecount
= (string)Request.QueryString["pagecount"];
if (!string.IsNullOrEmpty(pageno) && !string.IsNullOrEmpty(pagecount))
pageChanging(grvPage, Int32.Parse(pageno)
- 1, Int32.Parse(pagecount));
else
InitializeData();
}
}
private
void InitializeData()
{ //这里是数据绑定的代码
System.Data.DataTable dt
= new System.Data.DataTable();

dt.Columns.Add(
"NO", typeof(string));
dt.Columns.Add(
"Columns1", typeof(string));
dt.Columns.Add(
"Columns2", typeof(string));

for (int i = 0; i < 56; i++)
dt.Rows.Add(
"no" + i, "data1" + i, "data2" + i);

grvPage.DataSource
= dt;
grvPage.DataBind();
}
protected
void grvPage_PageIndexChanging(object sender, GridViewPageEventArgs e)
{ //点击分页功能的事件
GridView theGrid
= sender as GridView;
pageChanging(theGrid, e.NewPageIndex, theGrid.PageCount);
}
private
void pageChanging(GridView gv, int pn, int pc)
{ //分页-当前页号设定
int newPageIndex = pn;
newPageIndex
= newPageIndex >= pc ? pc - 1 : newPageIndex;
newPageIndex
= newPageIndex < 0 ? 0 : newPageIndex;

gv.PageIndex
= newPageIndex;
InitializeData();
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>自定义GridView分页模板中页码Button的实现</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="grvPage" runat="server" Font-Size="12px"
AllowPaging
="True" EmptyDataText="没有读卡器数据!" PageSize="5"
OnPageIndexChanging
="grvPage_PageIndexChanging">
<HeaderStyle BackColor="#C1D2FB" Font-Bold="True" ForeColor="Black" Height="20px" HorizontalAlign="Center" />
<RowStyle BackColor="#EFF3FB" ForeColor="#4A3C8C" Font-Size="12px" Height="20px" />
<AlternatingRowStyle BackColor="#EFF3FB" Font-Size="12px" Height="20px" />
<PagerSettings PageButtonCount="6" />
<PagerTemplate>
<table width="100%">
<tr>
<td style="text-align: right">
<asp:Label ID="lblPageIndex" runat="server" Text='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 %>' />页
共/
<asp:Label ID="lblPageCount" runat="server" Text='<%# ((GridView)Container.Parent.Parent).PageCount %>' />页
<% //首页/上一页 %>
<% if (this.grvPage.PageIndex <= 0)
{
%>
<asp:LinkButton runat="server" Enabled="false" Text="首页" />
<asp:LinkButton runat="server" Enabled="false" Text="上一页" />
<% }
else
{
%>
<asp:LinkButton runat="server" CausesValidation="False" CommandArgument="First" CommandName="Page" Text="首页" />
<asp:LinkButton runat="server" CausesValidation="False" CommandArgument="Prev" CommandName="Page" Text="上一页" />
<% } %>
<% //页码页 %>
<%
int pbc = this.grvPage.PagerSettings.PageButtonCount;
int pi = this.grvPage.PageIndex;
int pc = this.grvPage.PageCount;
int pstar = 0;
int pend = pc - 1;
if (pbc > 0 && pbc < pc)
{
int ps = pbc / 2;
pstar
= (pi > ps) ? ((pi + pbc - ps > pc) ? pc - pbc : pi - ps) : 0;
pend
= pstar + pbc - 1;
}
if (pstar > 0) Response.Write("<span>&nbsp;&nbsp;</span>");
for (int i = pstar; i <= pend; i++)
{
int pageno = i + 1;
if (i == pi)
Response.Write(
"<span style='background-color:Blue; color:#ffffff'>" + pageno + "</span>");
else
Response.Write(
"<a href='pageNO.aspx?pageno=" + pageno + "&pagecount=" + pc + "'>" + pageno + "</a>");
Response.Write(
"&nbsp;");
}
if (pend < pc - 1) Response.Write("<span>&nbsp;&nbsp;</span>");
%>
<% //下一页/尾页 %>
<% if (this.grvPage.PageIndex >= grvPage.PageCount - 1)
{
%>
<asp:LinkButton runat="server" Enabled="false" Text="下一页" />
<asp:LinkButton runat="server" Enabled="false" Text="尾页" />
<% }
else
{
%>
<asp:LinkButton runat="server" CausesValidation="False" CommandArgument="Next" CommandName="Page" Text="下一页" />
<asp:LinkButton runat="server" CausesValidation="False" CommandArgument="Last" CommandName="Page" Text="尾页" />
<% } %>
</td>
</tr>
</table>
</PagerTemplate>
</asp:GridView>
</div>
</form>
</body>
</html>
 
    首先,要将AllowPaging="True"设置,然后设置PageButtonCount和PageSize这样才能控制Button的个数(默认是10)。代码
Response.Write("<a href='pageNO.aspx?pageno=" + pageno + "&pagecount=" + pc + "'>" + pageno + "</a>");中的'pageNO.aspx是当前页面名。还要注意的是grvPage是GridView的ID。
    本人是初学ASP.net,有什么更好的方法,希望大家可以提出。
   
    原代码: pageNO.rar
   
-------------------------------------------------------------------
 
       程序我已经改进过了,解决了两个问题,一个数据行是不满一页时添加空行,另一个是总数据行都不满一页时分页功能行被隐藏的问题。大家可以到下面的文章中了解一下。
 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值