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,如需转载请自行联系原作者

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
pagination分页插件的getResult明明有数据,但是getTotal方法为0
pagination分页插件的getResult明明有数据,但是getTotal方法为0
370 0
分页解决方案 之 QuickPager的使用方法(在UserControl里面使用分页控件的方法)
        因为我一直没有在UserControl里面使用过QuickPager分页控件,我都是直接在.aspx里面使用,所以这个bug一直没有发现。后来告诉我他把分页控件放在了UserControl里面无法翻页的情况,检查之后才发现分页的事件没有传递到UserControl里面的分页控件里面,就是说分页控件没有得到分页事件。
942 0
分页解决方案 之 分页算法——Pager_SQL的思路和使用方法
      分页算法(也就是分页读取数据的时候使用的select 语句)面临两大难题:一个是不同的数据库使用的分页算法是不一样的(比如SQL Server 2000可以使用Max、表变量、颠倒Top,SQL Server 2005可以使用Row_Number,MySql可以使用limit ,Orcale可以使用ROWNUM等);另一个是,不同的分页需求,可以采用的分页算法也是不一样的(比如单字段排序和多字段排序)。
1105 0
分页解决方案 之 QuickPager的使用方法(目录)
      QuickPager asp.net 2.0 分页控件,基本告一段落。现在把使用方法、源码、Demo公布一下,感兴趣的可以下载看看。       一、从提取数据的角度开看,可以分为“自动”和“自定义”两种。
1097 0

热门文章

最新文章