他山之石,可以攻玉

我向往淡蓝色的未来 我体味淡蓝色的静谧 我永远都要争取机会 我希翼创造光彩未来!

用户操作
[即时聊天] [发私信] [加为好友]
johnsonID:johnsonTj
222617次访问,排名302好友0人,关注者3
johnsonTj的文章
原创 118 篇
翻译 0 篇
转载 214 篇
评论 9 篇
johnson的公告

今日天气

公告


Automobile
最近评论
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
debonair_wei:我想问一下此工具可以用在以oracle数据库为后台的权限管理中呢?如果可以,应该进行哪些相应的设置呢?
SUNLANDxiao:您好,可以再帮我解决一下这个问题么?我严格按照您的方式做了,但是在插入数据时,读入数据库的仍然是乱码。非常焦急,请您同我联系,帮我这个忙好么?感激不禁!
QQ:118180816
春暖花开
jingzi:好贴.
郁闷了N久:大哥,看了好多这方面的资料,好不容易转到您这里,可惜我的IE只能显示下面,上面是空白的,实在是调足了我的胃口,能给我发一篇完整的文章吗?谢谢!!
cz8961@163.com
文章分类
收藏
相册
ASP.Net 学习
Asp.Net官方站点学习
GotoDotnet学习站点
真实世界的 XML:使用 .NET 框架中集成的读取器和写入器很容易操作 XML 数据
cnBlog优秀Blog收藏
http://blog.csdn.net/zjcxc
http://blog.csdn.net/zjcxc
Struts环境配置手册
邹建
CSDN设计模式
CSDN设计模式学习
CSDN收藏的优秀Blog
bergn的Blog
younther的专栏
对象建模技术
IT经济
Java优秀文章收藏
Eclipse入门-- Eclipse的使用简介及插件开发
Elipse相关技术
Java设计模式学习
Josephus问题之Java乱弹篇(原创)
Spring - Java/J2EE Application Framework
用 IBM Holosofx 进行业务流程管理
简话设计模式
MSDN中文
如何快速实现HTML编辑器.NET组件
微软PetShop
微软中国社区
部署SQLServer数据安装程序
Oracle数据库学习
oracel学习
Oracle入门资料
PHP开发
PHP5 新函数
PHP5对象体系
Windows 环境下的PHP5 与 Apache 服务器的配置
基于面向对象技术的异构系统整合
龙头雏形渐显长江三角
编程资源网站收藏
中国软件网
程序人生
IT人网站
一个IT毕业生的挣扎----相当好的文章,未毕业或者即将毕业的学友该好好看看(完结篇)
一个IT毕业生的挣扎----相当好的文章,未毕业或者即将毕业的学友该好好看看(完结篇)
一个程序员真实的一天(ZT)
关注程序员健康,刻不容缓
职业经理自修手册
计算机族必喝的健康饮品
身体健康
五禽操帮电脑族找回活力
爱立信中国总裁杨迈猝死 爱立信中国惊魂48小时
电脑前的护眼窍门
程序员身体健康
数据结构
数据结构
业务建摸设计
RationalRose2003 安装破解说明
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 ASP.NET分页组件学与用——使用篇 收藏

新一篇: 立即释放.net下的com组件  | 旧一篇: 微软Bug管理

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)。

 

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

 

 

       该组件最后运行显示在客户端其实是一个表格,表格被分成三段,第一段是与页和记录相关的信息;第二段是页导航,该导航显示一组带超链接的数字,通过点击数字可以转移到对应的页;第三段有两个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);