zoukankan      html  css  js  c++  java
  • 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模块。


    附件是几个模块分页的存储过程

  • 相关阅读:
    python 得到请求的返回内容
    pyhton编码解码理解
    .NET数据库编程求索之路--1.引子
    (转)C#调用C函数(DLL)传递参数问题
    C# 如何在Excel 动态生成PivotTable
    高效Web开发的10个jQuery代码片段
    关于大型网站技术演进的思考(一)--存储的瓶颈(1)
    100. Same Tree
    226. Invert Binary Tree
    169. Majority Element
  • 原文地址:https://www.cnblogs.com/windsails/p/77953.html
Copyright © 2011-2022 走看看