Rainbow分页解决方案

简介:

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

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

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

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

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

protected Rainbow.UI.WebControls.IPaging pgModules;

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

            SettingItem PageSize =  new SettingItem( new 

Rainbow.UI.DataTypes.IntegerDataType());
            PageSize.Value = "10";
             this._baseSettings.Add("PageSize",PageSize);

放在构造函数Announcement()中。

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

pgModules.OnMove +=  new EventHandler(Page_Changed);

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

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

6. 定义新的DataBind函数:

         private  void BindList( int Page)
         {
            string sortField = Settings["SortField"].ToString();
            string sortDirection = Settings["SortDirection"].ToString();

            AnnouncementsDB announcements = new AnnouncementsDB();
            DataSet announces = announcements.GetAnnouncementsPaged(ModuleID, 

Version,Page,pgModules.RecordsPerPage);
            
            if (announces.Tables.Count>0 && announces.Tables[0].Rows.Count >0)
            {
               pgModules.RecordCount = (int)(announces.Tables[0].Rows[0]["RecordCount"]);
            }


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

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

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

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

CREATE    PROCEDURE rb_GetAnnouncementsPaged
(
    @ModuleID  int,
    @WorkflowVersion  int,
    @Page  int,
    @RecordsPerPage  int
)
AS

DECLARE @FirstRec  int, @LastRec  int

CREATE  TABLE #TempItems
(
ID  int  IDENTITY,
ItemID  int,
CreatedByUser  nvarchar( 100),
CreatedDate  datetime,
Title  nvarchar( 150),
MoreLink  nvarchar( 150),
MobileMoreLink  nvarchar( 150),
ExpireDate  datetime,
Description  nvarchar( 2000)
)

BEGIN 
SET NOCOUNT  ON

IF ( @WorkflowVersion  =  1 )
INSERT  INTO
#TempItems
(
ItemID, CreatedByUser, CreatedDate, Title,
MoreLink, MobileMoreLink, ExpireDate, Description
)
     SELECT
        ItemID,
        CreatedByUser,
        CreatedDate,
        Title,
        MoreLink,
        MobileMoreLink,
        ExpireDate,
        Description
     FROM 
        rb_Announcements
     WHERE
        ModuleID  = @ModuleID
       AND
        ExpireDate  >  GETDATE()
     ORDER  BY CreatedDate  DESC
ELSE
INSERT  INTO
#TempItems
(
ItemID, CreatedByUser, CreatedDate, Title,
MoreLink, MobileMoreLink, ExpireDate, Description
)
     SELECT
        ItemID,
        CreatedByUser,
        CreatedDate,
        Title,
        MoreLink,
        MobileMoreLink,
        ExpireDate,
        Description
     FROM 
        rb_Announcements_st
     WHERE
        ModuleID  = @ModuleID
       AND
        ExpireDate  >  GETDATE()
     ORDER  BY CreatedDate  DESC

SELECT @FirstRec  = (@Page  -  1* @RecordsPerPage
SELECT @LastRec  = (@Page  * @RecordsPerPage  +  1)

SELECT  *, ( SELECT  COUNT( *FROM #TempItems) RecordCount
FROM #TempItems
WHERE ID >@FirstRec  AND ID <@LastRec

SET NOCOUNT  OFF
END

GO

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

         public DataSet GetAnnouncementsPaged( int moduleID, WorkFlowVersion version, int page, 

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

            finally
            {
                myConnection.Close(); 
             }
             return myDataSet;
        }

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


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

相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
JavaScript
vue3 使用第三方插件问题 bundler to alias “vue“ to “vue/dist/vue.esm-bundler.js
vue3 使用第三方插件问题 bundler to alias “vue“ to “vue/dist/vue.esm-bundler.js
vue3 使用第三方插件问题 bundler to alias “vue“ to “vue/dist/vue.esm-bundler.js
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
902 1
|
人工智能 IDE 程序员
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
这个容易让程序员上瘾的 Agentic Coding 平台有哪些上头的功能?对于小白开发者和资深开发者如何用好Qoder呢?
19474 6
Qoder用户上手指南:安装、登录、快捷键、功能亮点(新用户免费领300credits,首购2美元/月)
|
10月前
|
前端开发 JavaScript
Font Awesome 一个基于CSS和LESS的免费图标库工具包
Font Awesome 是一款免费的图标字体库,基于 CSS 和 LESS,适用于个人和商业项目。它提供5000多个可缩放矢量图标,支持通过 CSS 轻松调整大小、颜色和阴影,适配高分辨率屏幕,极大提升网页开发效率。使用时只需引入 CSS 文件,即可通过类名快速调用图标,是现代前端开发的常用工具。
1522 0
Font Awesome 一个基于CSS和LESS的免费图标库工具包
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
自然语言处理 JavaScript 前端开发
vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载
【6月更文挑战第4天】导文 vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载 文章重点 内容效果展示: 当div拉到底部的时候: 在这里插入图片描述 编辑器返回: 在这里插入图片描述 代码展示 在Vue 2中,可以通过监听div的scroll事件来判断滚动条是否到达了底部。以下是一个简单的示例:
650 2
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
1223 17
|
缓存 前端开发 API
探索PWA(Progressive Web Apps)的无限可能
探索PWA(Progressive Web Apps)的无限可能
1067 8
|
JavaScript 前端开发 API
vue3的传送门teleport究竟有多神奇?suspense发起异步请求有多简约?
该文章介绍了Vue3中新特性Teleport和Suspense的使用方法,演示了如何使用Teleport进行DOM节点的非父子关系传送,以及Suspense在处理异步组件加载时的优雅展示和错误处理技巧。
|
JSON JavaScript 前端开发
VUE3(七)vue项目抽离.vue文件中的js、css代码
平常再做开发的时候,一般情况下不会将html,js,css代码写到一个文件中。 基本上都会写在各自对应的文件中,然后再引入即可。
1144 0
VUE3(七)vue项目抽离.vue文件中的js、css代码