PEAR_Pager的使用

本文介绍PEAR的Pager包,包括安装、使用示例及新闻列表分页应用。探讨分页模式和参数配置,如Jumping与Sliding样式、每页记录数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2.安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3.简单实例

通常以静态方法 factory 创建 Pager 类的实例。创建实例时,需要以数组的形式传递参数,每个数组的元素是一个参数。默认情况下必须有一个参数: itemData 或者 totalItems,参见下面的实例::

require_once("Pager/Pager.php");

// 参数数组
$params = array(
      // 分页模式,有两种显示模式,Jumping 和 Sliding
    'mode'       => 'Jumping',
    // 每页记录数
    'perPage'    => 3,
    // Jumping 模式下为可选页数,Sliding 模式下为当前页前后可选页数
    'delta'      => 5,
    'itemData'   => array(
              'record01',
              'record02',
              'record03',
              'record04',
              'record05',
              'record06',
              'record07',
              'record08',
              'record09',
              'record10',
              'record11',
              'record12',
              'record13',
              'record14',
              'record15',
              'record15',
              'record15',
              'record16'
      )
);

// 创建 Pager 对象
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等
$links = $pager->getLinks();

echo $links['all'];

其中 itemData 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4.应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

// 获得总的新闻数
$totalItems = 

1.前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2.安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3.简单实例

通常以静态方法 factory 创建 Pager 类的实例。创建实例时,需要以数组的形式传递参数,每个数组的元素是一个参数。默认情况下必须有一个参数: itemData 或者 totalItems,参见下面的实例::

require_once("Pager/Pager.php");

// 参数数组
$params = array(
      // 分页模式,有两种显示模式,Jumping 和 Sliding
    'mode'       => 'Jumping',
    // 每页记录数
    'perPage'    => 3,
    // Jumping 模式下为可选页数,Sliding 模式下为当前页前后可选页数
    'delta'      => 5,
    'itemData'   => array(
              'record01',
              'record02',
              'record03',
              'record04',
              'record05',
              'record06',
              'record07',
              'record08',
              'record09',
              'record10',
              'record11',
              'record12',
              'record13',
              'record14',
              'record15',
              'record15',
              'record15',
              'record16'
      )
);

// 创建 Pager 对象
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等
$links = $pager->getLinks();

echo $links['all'];

其中 itemData 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4.应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5.参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6.方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7.后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

GET['totalItems']; // 每页显示的新闻数 $pageSize = 10; // 当前页编号 $pageID = empty(

1.前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2.安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3.简单实例

通常以静态方法 factory 创建 Pager 类的实例。创建实例时,需要以数组的形式传递参数,每个数组的元素是一个参数。默认情况下必须有一个参数: itemData 或者 totalItems,参见下面的实例::

require_once("Pager/Pager.php");

// 参数数组
$params = array(
      // 分页模式,有两种显示模式,Jumping 和 Sliding
    'mode'       => 'Jumping',
    // 每页记录数
    'perPage'    => 3,
    // Jumping 模式下为可选页数,Sliding 模式下为当前页前后可选页数
    'delta'      => 5,
    'itemData'   => array(
              'record01',
              'record02',
              'record03',
              'record04',
              'record05',
              'record06',
              'record07',
              'record08',
              'record09',
              'record10',
              'record11',
              'record12',
              'record13',
              'record14',
              'record15',
              'record15',
              'record15',
              'record16'
      )
);

// 创建 Pager 对象
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等
$links = $pager->getLinks();

echo $links['all'];

其中 itemData 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4.应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5.参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6.方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7.后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

GET['pageID']) ? 1 :

1.前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2.安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3.简单实例

通常以静态方法 factory 创建 Pager 类的实例。创建实例时,需要以数组的形式传递参数,每个数组的元素是一个参数。默认情况下必须有一个参数: itemData 或者 totalItems,参见下面的实例::

require_once("Pager/Pager.php");

// 参数数组
$params = array(
      // 分页模式,有两种显示模式,Jumping 和 Sliding
    'mode'       => 'Jumping',
    // 每页记录数
    'perPage'    => 3,
    // Jumping 模式下为可选页数,Sliding 模式下为当前页前后可选页数
    'delta'      => 5,
    'itemData'   => array(
              'record01',
              'record02',
              'record03',
              'record04',
              'record05',
              'record06',
              'record07',
              'record08',
              'record09',
              'record10',
              'record11',
              'record12',
              'record13',
              'record14',
              'record15',
              'record15',
              'record15',
              'record16'
      )
);

// 创建 Pager 对象
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等
$links = $pager->getLinks();

echo $links['all'];

其中 itemData 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4.应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5.参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6.方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7.后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

GET['pageID']; // limit 子句 $limit = ($pageID - 1) * $pageSize . ", $pageSize"; // 获得新闻列表 $newsList = $news->get_list('latest', $limit, $totalItems); // 再对

1.前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2.安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3.简单实例

通常以静态方法 factory 创建 Pager 类的实例。创建实例时,需要以数组的形式传递参数,每个数组的元素是一个参数。默认情况下必须有一个参数: itemData 或者 totalItems,参见下面的实例::

require_once("Pager/Pager.php");

// 参数数组
$params = array(
      // 分页模式,有两种显示模式,Jumping 和 Sliding
    'mode'       => 'Jumping',
    // 每页记录数
    'perPage'    => 3,
    // Jumping 模式下为可选页数,Sliding 模式下为当前页前后可选页数
    'delta'      => 5,
    'itemData'   => array(
              'record01',
              'record02',
              'record03',
              'record04',
              'record05',
              'record06',
              'record07',
              'record08',
              'record09',
              'record10',
              'record11',
              'record12',
              'record13',
              'record14',
              'record15',
              'record15',
              'record15',
              'record16'
      )
);

// 创建 Pager 对象
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等
$links = $pager->getLinks();

echo $links['all'];

其中 itemData 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4.应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5.参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6.方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7.后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

GET['totalItems']赋值,也是Pager自定义URL GET参数的方法

1.前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2.安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3.简单实例

通常以静态方法 factory 创建 Pager 类的实例。创建实例时,需要以数组的形式传递参数,每个数组的元素是一个参数。默认情况下必须有一个参数: itemData 或者 totalItems,参见下面的实例::

require_once("Pager/Pager.php");

// 参数数组
$params = array(
      // 分页模式,有两种显示模式,Jumping 和 Sliding
    'mode'       => 'Jumping',
    // 每页记录数
    'perPage'    => 3,
    // Jumping 模式下为可选页数,Sliding 模式下为当前页前后可选页数
    'delta'      => 5,
    'itemData'   => array(
              'record01',
              'record02',
              'record03',
              'record04',
              'record05',
              'record06',
              'record07',
              'record08',
              'record09',
              'record10',
              'record11',
              'record12',
              'record13',
              'record14',
              'record15',
              'record15',
              'record15',
              'record16'
      )
);

// 创建 Pager 对象
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等
$links = $pager->getLinks();

echo $links['all'];

其中 itemData 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4.应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5.参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6.方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7.后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

GET['totalItems'] = $totalItems; // 创建 Pager 对象 $params = array( 'mode' => 'Sliding', 'perPage' => $pageSize, 'delta' => 2, 'totalItems' => $totalItems, ); $pager = Pager::factory($params); // 获得当前页(默认为第一页)的各种相关页链接 $links = $pager->getLinks(); // 模板赋值 $tpl->assign("pager", $links);

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5.参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
Imports System.Data Imports NPOI.HSSF.UserModel Imports NPOI.SS.UserModel Imports System.Collections.Generic Partial Class MIT2_AcceptQuery Inherits System.Web.UI.Page Dim db As SqlDb = New SqlDb() Dim ds As DataSet Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load If Not IsPostBack Then Dim sql = "SELECT DISTINCT 公司編號,公司名稱 FROM MITDEVIL.料號_count" ddlDataSet(pear, sql, "公司名稱", "公司編號") End If End Sub Sub ddlDataSet(ByVal dll As DropDownList, ByVal sql As String, ByVal text As String, ByVal value As String) ds = db.FillDataSet(sql) dll.Items.Clear() dll.DataSource = ds dll.DataTextField = text dll.DataValueField = value dll.DataBind() dll.Items.Insert(0, "") End Sub Protected Sub BTN_search_Click(sender As Object, e As System.EventArgs) Handles BTN_search.Click Dim sql As String = "SELECT 驗收單號 ,驗收序號 ,驗收人員 ,CONVERT(varchar(10),資料日期,111) 資料日期 ," & _ " 廠商編號 ,廠商名稱 ,料號 ,品名規格, 數量, 價格 ,單位 ,幣別 ,備註 ,廠別 ,匯率 ,異動類型 ," & _ " CONVERT(varchar(10),異動日期 ,111) 異動日期 ,集團類別 ,Price_Copy,Money,Date_Price_Copy " & _ " FROM [MITDEVIL].[計劃異動] WHERE 1=1 " If pear.Text = "" Then System.Web.UI.ScriptManager.RegisterStartupScript(UpdatePanel1, GetType(UpdatePanel), "AjaxMsgBox", "alert('請選擇基準公司!');", True) Exit Sub Else sql = sql + " AND 公司編號='" + pear.SelectedItem.Value + "'" End If If part_number.Text <> "" Then sql = sql + " AND 料號='" + part_number.Text + "'" End If If stradate.Value <> "" Then sql = sql + " AND 資料日期 >='" + stradate.Value + "'" End If If enddate.Value <> "" Then sql = sql + " AND 資料日期 <= '" + enddate.Value + "'" End If If createdate.Value <> "" Then sql = sql + " AND convert(char(10),創建日期,111) = convert(char(10),'" + createdate.Value + "',111)" End If sql = sql + " ORDER BY 資料日期 DESC " ViewState("AcceptDT") = db.FillDataSet(sql).Tables(0) GridView1.DataSource = db.FillDataSet(sql) ViewState("sql") = sql GridView1.DataBind() End Sub Protected Sub btn_export_Click(sender As Object, e As System.EventArgs) Handles btn_export.Click Dim arr As New ArrayList Try arr.Add("驗收單號") arr.Add("驗收序號") arr.Add("驗收人員") arr.Add("資料日期") arr.Add("廠商編號") arr.Add("廠商名稱") arr.Add("料號") arr.Add("品名規格") arr.Add("數量") arr.Add("價格") arr.Add("單位") arr.Add("幣別") arr.Add("備註") arr.Add("廠別") arr.Add("匯率") arr.Add("異動類型") arr.Add("異動日期") arr.Add("集團類別") arr.Add("價格冊單價") arr.Add("價格冊幣別") arr.Add("價格冊生效日期") SaveDate(CreateExcel(db.FillDataSet(ViewState("sql")), arr), "驗收單資料.xls") Catch ex As Exception Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "MsgBox", "alert(轉檔失敗,請重試或者聯繫系統負責人');", True) ' Return End Try End Sub Private Function CreateExcel(ByVal ds As DataSet, ByVal arrs As ArrayList) As NPOI.SS.UserModel.IWorkbook Dim workbook As IWorkbook = New NPOI.HSSF.UserModel.HSSFWorkbook() Dim sheet As New ArrayList Dim sheet1 As NPOI.SS.UserModel.ISheet = workbook.CreateSheet(arrs(0)) sheet.Add(sheet1) If arrs.Count = 4 Then Dim sheet4 As NPOI.SS.UserModel.ISheet = workbook.CreateSheet(arrs(3)) sheet.Add(sheet4) End If Dim headstyle As ICellStyle = workbook.CreateCellStyle Dim headfontstyle As HSSFFont = workbook.CreateFont 'Dim textfontstyle As HSSFFont = workbook.CreateFont Dim textstyle As HSSFCellStyle = workbook.CreateCellStyle Dim textstyle2 As HSSFCellStyle = workbook.CreateCellStyle Dim textstyle3 As HSSFCellStyle = workbook.CreateCellStyle Dim textstyle4 As HSSFCellStyle = workbook.CreateCellStyle Dim formact As HSSFDataFormat = workbook.CreateDataFormat Dim arr As New ArrayList With headfontstyle .Boldweight = NPOI.SS.UserModel.FontBoldWeight.Bold End With 'With textfontstyle ' .Boldweight = NPOI.SS.UserModel.FontBoldWeight.Bold ' .Color = NPOI.SS.UserModel.FontColor.Red 'End With With headstyle .Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center ' .VerticalAlignment = SS.UserModel.VerticalAlignment.Center '.WrapText = True .SetFont(headfontstyle) .BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin .BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin .BorderTop = NPOI.SS.UserModel.BorderStyle.Thin .BorderRight = NPOI.SS.UserModel.BorderStyle.Thin End With With textstyle .Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left .BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin .BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin .BorderTop = NPOI.SS.UserModel.BorderStyle.Thin .BorderRight = NPOI.SS.UserModel.BorderStyle.Thin End With With textstyle2 '日期格式的 .Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center .BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin .BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin .BorderTop = NPOI.SS.UserModel.BorderStyle.Thin .BorderRight = NPOI.SS.UserModel.BorderStyle.Thin .DataFormat = HSSFDataFormat.GetBuiltinFormat("yyyy/MM/dd") End With With textstyle3 '數值帶千分位格式的 .Alignment = NPOI.SS.UserModel.HorizontalAlignment.Right .BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin .BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin .BorderTop = NPOI.SS.UserModel.BorderStyle.Thin .BorderRight = NPOI.SS.UserModel.BorderStyle.Thin '.DataFormat = HSSFDataFormat.GetBuiltinFormat("G/通用格式") .DataFormat = formact.GetFormat("0.00") End With With textstyle4 '數值格式的 .Alignment = NPOI.SS.UserModel.HorizontalAlignment.Right .BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin .BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin .BorderTop = NPOI.SS.UserModel.BorderStyle.Thin .BorderRight = NPOI.SS.UserModel.BorderStyle.Thin .DataFormat = formact.GetFormat("0") End With arr.Add(textstyle) arr.Add(textstyle2) arr.Add(textstyle3) arr.Add(textstyle4) '開始寫入SHEET1 '创建行 Dim row As NPOI.SS.UserModel.IRow = sheet(0).CreateRow(0) For k As Integer = 0 To arrs.Count - 1 '创建单元格 Dim cell As NPOI.SS.UserModel.ICell = row.CreateCell(k) '设置单元格值 cell.SetCellValue(arrs(k).ToString) cell.CellStyle = headstyle Next For i As Integer = 0 To ds.Tables(0).Rows.Count - 1 '创建行 row = sheet(0).CreateRow(i + 1) For j As Integer = 0 To ds.Tables(0).Columns.Count - 1 '创建单元格 Dim cell As NPOI.SS.UserModel.ICell = row.CreateCell(j) '设置单元格值 'cell.SetCellValue(ds.Tables(0).Rows(i)(field.Item(j).ToString).ToString) ' cell.CellStyle = textstyle SetCellValueByColumnType(row, j, ds.Tables(0).Rows(i)(j), ds.Tables(0).Columns(j), arr) Next Next For i As Integer = 0 To ds.Tables(0).Columns.Count - 1 sheet(0).AutoSizeColumn(i) Next Return workbook End Function Private Sub SetCellValueByColumnType(ByVal myExcelRow As NPOI.SS.UserModel.IRow, ByVal myNewCellIndex As Integer, _ ByVal myValue As Object, ByVal myDataColumn As DataColumn, ByVal arr As ArrayList) If myExcelRow Is Nothing Then Exit Sub If myNewCellIndex < 0 Then Exit Sub If myValue Is Nothing Then Exit Sub If myDataColumn Is Nothing Then Exit Sub Select Case (myDataColumn.DataType.ToString()) Case "System.String" '://字符串类型 myExcelRow.CreateCell(myNewCellIndex).SetCellValue(myValue.ToString().Trim) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) Case "System.DateTime" '://日期类型 If Not IsDBNull(myValue) Then myExcelRow.CreateCell(myNewCellIndex).SetCellValue(Convert.ToDateTime(myValue).ToShortDateString) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(1) Else myExcelRow.CreateCell(myNewCellIndex).SetCellValue(myValue.ToString().Trim) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) End If Case "System.Boolean" '://布尔型 If Not IsDBNull(myValue) Then If Convert.ToBoolean(myValue) Then myExcelRow.CreateCell(myNewCellIndex).SetCellValue("True") Else myExcelRow.CreateCell(myNewCellIndex).SetCellValue("False") End If End If Case "System.Int16", "System.Int32", "System.Int64" '://整型 If Not IsDBNull(myValue) Then myExcelRow.CreateCell(myNewCellIndex).SetCellValue(Convert.ToInt64(myValue)) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(3) Else myExcelRow.CreateCell(myNewCellIndex).SetCellValue(myValue.ToString().Trim) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) End If Case "System.Byte" If Not IsDBNull(myValue) Then myExcelRow.CreateCell(myNewCellIndex).SetCellValue(Convert.ToByte(myValue)) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) Else myExcelRow.CreateCell(myNewCellIndex).SetCellValue(myValue.ToString().Trim) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) End If Case "System.Decimal" '://浮点型 If Not IsDBNull(myValue) Then myExcelRow.CreateCell(myNewCellIndex).SetCellValue(Convert.ToDecimal(myValue)) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(2) Else myExcelRow.CreateCell(myNewCellIndex).SetCellValue(myValue.ToString().Trim) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) End If Case "System.Double" If Not IsDBNull(myValue) Then myExcelRow.CreateCell(myNewCellIndex).SetCellValue(Convert.ToDouble(myValue)) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(2) Else myExcelRow.CreateCell(myNewCellIndex).SetCellValue(myValue.ToString().Trim) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) End If Case Else myExcelRow.CreateCell(myNewCellIndex).SetCellValue(myValue.ToString().Trim) myExcelRow.GetCell(myNewCellIndex).CellStyle = arr(0) End Select End Sub Private Sub SaveDate(ByVal workbook As NPOI.SS.UserModel.IWorkbook, ByVal ExcelName As String) Dim ms As IO.MemoryStream Try '建立資料流 ms = New IO.MemoryStream() '寫入資料流 workbook.Write(ms) '在頁面輸出資料 Dim filename As String = "attachment;filename=" & HttpUtility.UrlEncode(ExcelName, Encoding.UTF8).ToString() Response.AddHeader("Content-Disposition", filename) Response.BinaryWrite(ms.ToArray()) Catch ex As Exception Finally '釋放資源 If Not ms Is Nothing Then ms.Dispose() ms.Close() End If End Try End Sub Protected Sub GridView1_PageIndexChanging(sender As Object, e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging GridView1.PageIndex = e.NewPageIndex GridView1.DataSource = ViewState("AcceptDT") GridView1.DataBind() End Sub End Cl给gridciew1绑定一个翻页功能
06-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值