ASP.NET分页组件学与用——使用篇

ASP.NET分页组件学与用——使用篇

大家好,这篇文章承启上一篇文章《ASP.NET分页组件学与用——教学篇》。

在《ASP.NET分页组件学与用——教学篇》中,我们讲解了分页组件的整个创建过程,那么在这一篇文章中,我们主要讨论一下如何使用该组件。

请按以下步骤操作:

1、 创建一个WEB应用程序工程。

2、 将上篇文章中生成的组件添加到工具箱中。如果您不知道添加的过程,请参考文章《ASP.NET组件编程step by step

3、 在默认的WEB窗体页面中,切换到HTML视图,把下列HTML代码复制到<form>标签中。

<div align="center">

<center>

<table border="0" cellpadding="0" cellspacing="0" width="756" height="155" style="FONT-SIZE:12px">

<tr>

<td width="756" height="23">分页控件的使用实例</td>

</tr>

<tr>

<td width="756" height="110" valign="top" align="center" runat="server" id="myHtml"></td>

</tr>

<tr>

<td width="756" height="22">

</td>

</tr>

</table>

</center>

</div>

4、 HTML代码生成一个三行一列的表格,从工具箱将控件拖到该表格的第三行中。

5、 private void Page_Load(object sender, System.EventArgs e)事件处理程序中添加如下代码:

int cp;

if(this.Request.Params["currentPage"] == null)

{

cp = 1;

}

else

{

cp = Convert.ToInt32(this.Request.Params["currentPage"]);

}

SqlConnection con = new SqlConnection("server=accp-lzh;uid=sa;pwd=sasa;database=Northwind");

SqlCommand cmd = new SqlCommand("select * from [Order Details]",con);

SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = cmd;

DataSet ds = new DataSet();

con.Open();

adapter.Fill(ds,"table");

con.Close();

DataTable dt = new DataTable();

dt = ds.Tables["table"];

//以下设置控件参数

this.LzhPages1.AllCount = dt.Rows.Count;//总记录条数

this.LzhPages1.CurrentPage = cp;//当前页,从URL中读取

this.LzhPages1.ShowPages = 10;//导航数字个数

this.LzhPages1.Count = 10;//每页显示的记录条数

StringBuilder sql = new StringBuilder();

//以下三个字符串最终组合成一个完整的表格<table>

string htmlHeader = "";//<table>标签

string htmlBody = "";//中间有若干个<tr>标签,即行

string htmlFoot = "";//</table>标签

sql.AppendFormat("select top {0} * from [Order Details] where 1=1 and OrderID not in (select top {1} OrderID from [Order Details] where 1=1 order by OrderID desc) order by OrderID desc",this.LzhPages1.Count,this.LzhPages1.CurrentPage * this.LzhPages1.Count);

SqlCommand cmd1 = new SqlCommand(sql.ToString(),con);

adapter.SelectCommand = cmd1;

con.Open();

adapter.Fill(ds,"table1");

con.Close();

dt= ds.Tables["table1"];

htmlHeader = "<table style='font-size:12px' border='1' cellpadding='0' cellspacing='0' width='100%' bordercolor='#008000' bordercolorlight='#008000' bordercolordark='#FFFFFF'>\n";

for(int i = 0;i < dt.Rows.Count ;i ++)

{

htmlBody = htmlBody + String.Format("<tr>\n<td width='12%'>{0}</td>\n<td width='43%'>{1}</td>\n<td width='24%'>{2}</td><td width='21%'>{3}</td>\n</tr>\n",dt.Rows[i][0].ToString(),dt.Rows[i][1].ToString(),dt.Rows[i][2].ToString(),dt.Rows[i][3].ToString());

}

htmlFoot = "</table>\n";

this.myHtml.InnerHtml = htmlHeader + htmlBody + htmlFoot;

6、 sql.AppendFormat("select top {0} * from [Order Details] where 1=1 and OrderID not in (select top {1} OrderID from [Order Details] where 1=1 order by OrderID desc) order by OrderID desc",this.LzhPages1.Count,this.LzhPages1.CurrentPage * this.LzhPages1.Count);此语句中的SQL语句就是用来分页的,我们的控件只是用来控制页面,数据还得通过SQL语句或存储过程读取。

7、 结果图:

ASP.NET分页组件学与用——教学篇

ASP.NET分页组件学与用——教学篇

没有人会怀疑分页组件在WEB应用程序中的作用。数据库中的记录数成千上万甚至过亿,如果一股脑儿显示在一页显然毫不现实,这样的程序员也太小儿科了。所以,最好的办法就是分页显示,每页只显示数据库中的一部分记录,可以翻页,也可以输入一个页码翻到指定的页面,这种方式也是当前比较常见的用法。

本文的不同之处在于,我把分页的功能封装在组件中,一方面体现了面向对象的特点,另一方面也方便发布、共享和使用。事先声明,本文不再讲述组件创建的详细过程,如果有疑点请参考本BLOG其他相关文章(asp.net组件设计浅论,ASP.NET组件编程step by step)。

首先来看看该组件的外观:

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><font size="2"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></font></shapetype>

该组件最后运行显示在客户端其实是一个表格,表格被分成三段,第一段是与页和记录相关的信息;第二段是页导航,该导航显示一组带超链接的数字,通过点击数字可以转移到对应的页;第三段有两个HTML控件,用户可以输入数字转移到指定的页。从图中也可以看出,该组件的功能非常简单明了。

首先我们来关注第一部分。这一部分信息包括:当前页,总页数,每页显示的记录条数和总的记录条数。这些信息从组件外部传进来,所以我们定义对应的属性:

private int _count;//每页显示的记录条数

private int _currentPage;//当前页

private int _allCount;//所有记录条数

private int _showPages;//显示数字个数

我在注释_showPages这个属性的时候有点晦涩,所以需要简单的讲一下:该属性用来定义数字导航栏显示的数字个数,在上面的图中,定义显示10个数字,即从201——210,当然,根据需要,我们可以定义任意多个数字。

[DefaultValue(10),Category("Customer")]

public int Count

{

set

{

if(value <= 0)

_count = 1;

else

_count = value;

}

get

{

return _count;

}

}

[DefaultValue(1),Category("Customer")]

public int CurrentPage

{

set

{

if(value < 0)

_currentPage = 1;

else

_currentPage = value;

}

get

{

return _currentPage;

}

}

[DefaultValue(1),Category("Customer")]

public int AllCount

{

get

{

return _allCount;

}

set

{

if(_allCount < 0)

throw new Exception("记录总条数不能为负数");

else

_allCount = value;

}

}

[DefaultValue(1),Category("Customer")]

public int Pages//总页数

{

get

{

if(this._allCount % this._count > 0)

return ((int)this._allCount / this._count) + 1;

else

return ((int)this._allCount / this._count);

}

}

[DefaultValue(1),Category("Customer")]

public int ShowPages

{

set

{

if(value > 0)

_showPages = value;

else

_showPages = 9;

}

get

{

return _showPages;

}

}

在定义的属性中,有一个叫Pages的属性,该属性不需要从外面传值,而过计算出来的。他的值等于总记录条数除以每页显示的记录条数(具体请见代码)。

现在我们要把这些值显示出来,用下面的代码显示:

//分页条分三部分,leftInfo是最左边的部分,用来显示当前页/总页数,每页显示的记录条数

leftInfo = "页:" + this.CurrentPage.ToString() + "/" + this.Pages.ToString() + "&nbsp;&nbsp;" + "每页" + this.Count.ToString() + "条" + "&nbsp;&nbsp;共" + this.AllCount.ToString() + "条";

第二段比较复杂。组件的页面导航数字是连续的,所以,我定义了一个最小值和最大值:

int min;//要显示的页面导航数最小值

int max;//要显示的页面导航数最大值

设计时,需要考虑三种情况:

1:如果当前页除以ShowPages余数为0,也就是恰好可以整除的话,页面导航数字最小值和最大值分别是:

min最小值 = 当前页 + 1

max最大值 = 当前页 + 页面导航数字个数(ShowPages)

对应代码:

if(this.CurrentPage % this.ShowPages == 0) //如果恰好整除

{

min = this.CurrentPage + 1;

max = this.CurrentPage + this.ShowPages ;

}

2:如果当前页是导航数字最小值时,应该切换到前一组导航数字。此时,导航数字的最小值和最大值分别是:

min最小值 = (((int)当前页 / 页面导航数字个数ShowPages ) - 1) *页面导航数字个数ShowPages +1;

max最大值 = 当前页 1

对应代码如下:

else if(this.CurrentPage % this.ShowPages == 1 && this.CurrentPage > this.ShowPages )

{

min = (((int)this.CurrentPage / this.ShowPages ) - 1) * this.ShowPages +1;

max = this.CurrentPage - 1;

}

3:如果当前页是导航数字最大值时,应该切换到后一组导航数字。此时,导航数字的最小值和最大值分别是:

min最小值 = ((int)当前页 / 页面导航数字个数ShowPages) * 页面导航数字个数ShowPages + 1

max最大值 = (((int)当前页 / 页面导航数字个数ShowPages) +1) * 页面导航数字个数ShowPages

对应代码如下:

else

{

min = ((int)this.CurrentPage / this.ShowPages) * this.ShowPages + 1;

max = (((int)this.CurrentPage / this.ShowPages) +1) * this.ShowPages;

}

即然导航数字列表的最小值和最大值都计算出来了,所以我们通个做一个循环操作就可以生成该导航,当前页用斜体红色字体突出显示:

for(int i = min ; i <= max ; i++)

{

if(i <= this.Pages)//只有不大于最大页才显示

{

if(this.CurrentPage == i)//如果是当前页,用斜体和红色显示

{

numberStr = numberStr + "<a href=" + AbsUrl + "?currentPage=" + i.ToString() + ">" + "<I style='color:red'>" + i.ToString() + "</I>" +"</a>" + "\n";

}

else

{

numberStr = numberStr + "<a href=" + AbsUrl + "?currentPage=" + i.ToString() + ">" + i.ToString() +"</a>" + "\n";

}

}

}

大家应该看出来了,在导航列表的最前面和最后面一共还有四个图标,这几个图标并不是图片,而是7348四个数字的Wedding字体。这四个图标的代码如下:

//第一页,上一页,下一页,最后一页

string First,Previous,Next,Last;

First = AbsUrl + "?currentPage=1";

/

if(this.CurrentPage == 1)

Previous = AbsUrl + "?currentPage=1";

else

Previous = AbsUrl + "?currentPage=" + (this.CurrentPage - 1).ToString();

/

if(this.CurrentPage == this.Pages)

Next = AbsUrl + "?currentPage=" + this.Pages;

else

Next = AbsUrl + "?currentPage=" + (this.CurrentPage + 1).ToString();

/

Last = AbsUrl + "?currentPage=" + this.Pages;

接下来的代码就是生成要输出到客户端的HTML字符串:

centerInfo.AppendFormat("<font face='Webdings' style='font-size:14px'><a href={0}>7</a><a href={1}>3</a></font>{2}<font face='Webdings' style='font-size:14px'><a href={3}>4</a><a href={4}>8</a></font>",First,Previous,numberStr,Next,Last);

StringBuilder sb = new StringBuilder();//HTML字符串

sb.AppendFormat("<table style = 'font-size:12px' border='0' cellpadding='0' cellspacing='0' width='100%'> \n " +

"<tr>\n" +

"<td width='25%' align='left'>{0}</td>\n" +

"<td width='61%' align='right'>{1}</td>\n" +

"<td width='14%' align='right'><input type='text' name='T1' size='4' style='border-bottom:solid 1pt gray;border-top :solid 1pt gray; border-left:solid 1pt gray;border-right:solid 1pt gray;'> \n <input type='button' name='B1' size='6' value=go style='border-bottom:solid 1pt gray;border-top :solid 1pt gray; border-left:solid 1pt gray;border-right:solid 1pt gray;' οnclick='go(T1,{2})'></td>\n" +

"</tr>\n" +

"</table>",leftInfo,

centerInfo.ToString(),

this.Pages);

真正输出,重写protected override void Render(HtmlTextWriter writer)方法,输出代码如下:writer.Write(sb.ToString());

很辛苦,不过辛苦还要继续。呵!^_^

最后要完成的是第三段了,这一段我们用JavaScript脚本完成。用户输入数据到文本框时,先检测是否符合要求,不能是非数字,也不能超过最大页面范围。如果符合要求,则将浏览器的地址栏改成对应的URL地址即可。

脚本如下:

<script language="javascript">

function go(ctrl,max)

{

if(ctrl.value >= 1 && ctrl.value <= max)

{

var url;

var index;

url = location.href;

index = url.indexOf('?');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值