Rainbow分页解决方案

简介:

Rainbow是C#编写的一个优秀的开源门户网站项目。无论是实际应用还是拿来学习,都是一个不错的选择。目前似乎汉化最好的是RC4的版本,在bussoft有下载。但遗憾的是其中很多的功能模块都不提供分页的功能。在网上找了下,发现以下的解决方案:
Rainbow其实已经自带分页的功能支持,如在Rainbow.UI.WebControls下,IPaging接口、Paging和PagingNumbers控件在RC4版本中都是现成的了。
在每个对应模块中按照一定的步骤适当修改一下原有的代码及其存储过程,就可以达到分页的目的:
以Announcements模块为例:
1. 增加代码到ascx的头部分:

None.gif<%@ Register TagPrefix="cc2" Namespace="Rainbow.UI.WebControls" Assembly="Rainbow" %>

在需要放置分页器的地方放置以下代码:

None.gif<p align =right ><cc2:Paging id="pgModules" runat="server" /></p>

这个是放置在右下角的例子。
2. 在ascx对应的cs代码中声明分页器模块:

None.gif protected Rainbow.UI.WebControls.IPaging pgModules;

3. 声明分页的缺省大小:

None.gif            SettingItem PageSize =  new SettingItem( new 
None.gif
None.gifRainbow.UI.DataTypes.IntegerDataType());
None.gif            PageSize.Value = "10";
None.gif             this._baseSettings.Add("PageSize",PageSize);
None.gif

放在构造函数Announcement()中。

4. 在初始化OnInit代码部分添加事件代理的响应:

None.gifpgModules.OnMove +=  new EventHandler(Page_Changed);

5. 当然需要添加对应的Page_Changed代码:

None.gif   private  void Page_Changed( object sender, System.EventArgs e)
ExpandedBlockStart.gif   {
InBlock.gif    pgModules.RecordsPerPage = Int32.Parse(Settings["PageSize"].ToString());
InBlock.gif    BindList(pgModules.PageNumber);  
ExpandedBlockEnd.gif  }

None.gif

6. 定义新的DataBind函数:

None.gif         private  void BindList( int Page)
ExpandedBlockStart.gif         {
InBlock.gif            string sortField = Settings["SortField"].ToString();
InBlock.gif            string sortDirection = Settings["SortDirection"].ToString();
InBlock.gif
InBlock.gif            AnnouncementsDB announcements = new AnnouncementsDB();
InBlock.gif            DataSet announces = announcements.GetAnnouncementsPaged(ModuleID, 
InBlock.gif
InBlock.gifVersion,Page,pgModules.RecordsPerPage);
InBlock.gif            
InBlock.gif            if (announces.Tables.Count>0 && announces.Tables[0].Rows.Count >0)
ExpandedSubBlockStart.gif            {
InBlock.gif               pgModules.RecordCount = (int)(announces.Tables[0].Rows[0]["RecordCount"]);
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif                DataView myDataView = new DataView();
InBlock.gif                myDataView = announces.Tables[0].DefaultView;
InBlock.gif                myDataView.Sort = sortField + " " + sortDirection;            
InBlock.gif                myDataList.DataSource = myDataView;
InBlock.gif                myDataList.DataBind();
ExpandedBlockEnd.gif        }

None.gif

7. 在Page_Load中,替换掉原来的Databind的方法:

None.gif                pgModules.RecordsPerPage = Int32.Parse(Settings["PageSize"].ToString());
None.gif                BindList(pgModules.PageNumber); None.gif

8. 在数据库中建立对应的分页操作的存储过程,如 rb_GetAnnouncementsPaged,注意付给适当的权限。

None.gif CREATE    PROCEDURE rb_GetAnnouncementsPaged
None.gif(
None.gif    @ModuleID  int,
None.gif    @WorkflowVersion  int,
None.gif    @Page  int,
None.gif    @RecordsPerPage  int
None.gif)
None.gif AS
None.gif
None.gif None.gif DECLARE @FirstRec  int, @LastRec  int
None.gif
None.gif None.gif CREATE  TABLE #TempItems
None.gif(
None.gifID  int  IDENTITY,
None.gifItemID  int,
None.gifCreatedByUser  nvarchar( 100),
None.gifCreatedDate  datetime,
None.gifTitle  nvarchar( 150),
None.gifMoreLink  nvarchar( 150),
None.gifMobileMoreLink  nvarchar( 150),
None.gifExpireDate  datetime,
None.gifDescription  nvarchar( 2000)
None.gif)
None.gif
None.gif BEGIN 
None.gif SET NOCOUNT  ON
None.gif
None.gif IF ( @WorkflowVersion  =  1 )
None.gif INSERT  INTO
None.gif#TempItems
None.gif(
None.gifItemID, CreatedByUser, CreatedDate, Title,
None.gifMoreLink, MobileMoreLink, ExpireDate, Description
None.gif)
None.gif     SELECT
None.gif        ItemID,
None.gif        CreatedByUser,
None.gif        CreatedDate,
None.gif        Title,
None.gif        MoreLink,
None.gif        MobileMoreLink,
None.gif        ExpireDate,
None.gif        Description
None.gif     FROM 
None.gif        rb_Announcements
None.gif     WHERE
None.gif        ModuleID  = @ModuleID
None.gif       AND
None.gif        ExpireDate  >  GETDATE()
None.gif     ORDER  BY CreatedDate  DESC
None.gif ELSE
None.gif INSERT  INTO
None.gif#TempItems
None.gif(
None.gifItemID, CreatedByUser, CreatedDate, Title,
None.gifMoreLink, MobileMoreLink, ExpireDate, Description
None.gif)
None.gif     SELECT
None.gif        ItemID,
None.gif        CreatedByUser,
None.gif        CreatedDate,
None.gif        Title,
None.gif        MoreLink,
None.gif        MobileMoreLink,
None.gif        ExpireDate,
None.gif        Description
None.gif     FROM 
None.gif        rb_Announcements_st
None.gif     WHERE
None.gif        ModuleID  = @ModuleID
None.gif       AND
None.gif        ExpireDate  >  GETDATE()
None.gif     ORDER  BY CreatedDate  DESC
None.gif
None.gif SELECT @FirstRec  = (@Page  -  1* @RecordsPerPage
None.gif SELECT @LastRec  = (@Page  * @RecordsPerPage  +  1)
None.gif
None.gif SELECT  *, ( SELECT  COUNT( *FROM #TempItems) RecordCount
None.gif FROM #TempItems
None.gif WHERE ID >@FirstRec  AND ID <@LastRec
None.gif
None.gif SET NOCOUNT  OFF
None.gif END
None.gif
None.gif GO
None.gif

9. 当然,数据访问层也需要修改,如6中也可以看到了,需要增加GetAnnouncementsPaged函数在AnnouncementsDB中:

None.gif         public DataSet GetAnnouncementsPaged( int moduleID, WorkFlowVersion version, int page, 
None.gif
None.gif int perPageNumber) 
ExpandedBlockStart.gif         {
InBlock.gif            SqlConnection myConnection = PortalSettings.SqlConnectionString;
InBlock.gif            SqlDataAdapter myCommand = new SqlDataAdapter("rb_GetAnnouncementsPaged", myConnection);
InBlock.gif            myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
InBlock.gif            SqlParameter parameterModuleID = new SqlParameter("@ModuleID", SqlDbType.Int, 4);
InBlock.gif            parameterModuleID.Value = moduleID;
InBlock.gif            myCommand.SelectCommand.Parameters.Add(parameterModuleID);
InBlock.gif            SqlParameter parameterWorkflowVersion = new SqlParameter("@WorkflowVersion", SqlDbType.Int, 4);
InBlock.gif            parameterWorkflowVersion.Value = (int)version;
InBlock.gif            myCommand.SelectCommand.Parameters.Add(parameterWorkflowVersion);
InBlock.gif            SqlParameter parameterPage = new SqlParameter("@Page", SqlDbType.Int, 4);
InBlock.gif            parameterPage.Value = page;
InBlock.gif            myCommand.SelectCommand.Parameters.Add(parameterPage);
InBlock.gif            SqlParameter parameterPerPageNumber = new SqlParameter("@RecordsPerPage", SqlDbType.Int, 4);
InBlock.gif            parameterPerPageNumber.Value = perPageNumber;
InBlock.gif            myCommand.SelectCommand.Parameters.Add(parameterPerPageNumber);
InBlock.gif            DataSet myDataSet = new DataSet();
InBlock.gif            try
ExpandedSubBlockStart.gif            {
InBlock.gif                myCommand.Fill(myDataSet);
ExpandedSubBlockEnd.gif            }

InBlock.gif            finally
ExpandedSubBlockStart.gif            {
InBlock.gif                myConnection.Close(); 
InBlock.gif             }
InBlock.gif             return myDataSet;
ExpandedBlockEnd.gif        }
None.gif

10. 有些模块原来是使用SqlDataReader的,在分页中也可以适当将其分页用DataSet来替代,如Discussion模块。


本文转自风前絮~~博客园博客,原文链接:http://www.cnblogs.com/windsails/archive/2004/12/16/77953.html,如需转载请自行联系原作者

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
6月前
在阿里云RPA中,你可以使用"表格控件"来处理网页上的table数据
在阿里云RPA中,你可以使用"表格控件"来处理网页上的table数据
75 1
|
10月前
|
JavaScript 数据可视化
数据可视化大屏使用ipad-page-flip插件JS库制作Flipping Book的样式表解决方案
数据可视化大屏使用ipad-page-flip插件JS库制作Flipping Book的样式表解决方案
87 0
数据可视化大屏使用ipad-page-flip插件JS库制作Flipping Book的样式表解决方案
|
存储 索引
Tile38空间数据库的核心搜索功能
Tile38空间数据库的核心搜索功能
244 0
|
人工智能 算法 PHP
解决thinkphp中paginate分页排版竖着的问题
愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海!愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海!❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!❤️❤️❤️ 最后,希望我的这篇文章能对你的有所帮助!
解决thinkphp中paginate分页排版竖着的问题
|
SQL 存储 算法
【自然框架】QuickPager分页控件的总体介绍和在线演示
QuickPager分页控件的特点    两种运行方式:自动运行、手动运行。前者便捷,后者灵活。  多种分页方式:Postback、Postback伪URL、URL、URL重写、Ajax For服务器控件伪URL。
1071 0
|
算法
分页解决方案 之 QuickPager的使用方法(在UserControl里面使用分页控件的方法)
        因为我一直没有在UserControl里面使用过QuickPager分页控件,我都是直接在.aspx里面使用,所以这个bug一直没有发现。后来告诉我他把分页控件放在了UserControl里面无法翻页的情况,检查之后才发现分页的事件没有传递到UserControl里面的分页控件里面,就是说分页控件没有得到分页事件。
904 0
|
JavaScript 前端开发
【自然框架】js版的QuickPager分页控件 V2.0
优点: 1、  通过更换模板可以控制各个分页元素(比如首页、末页,页号导航等)的位置和是否显示。 2、  通过更换css可以实现各种UI风格和效果。(附带24套css效果) 3、  Js的方式创建分页UI,不占用服务器资源。
1459 0