ASP.NET--Repeater控件分页功能实现

这两天由于‘销售渠道’系统需要实现新功能,开发了三个页面,三个界面功能大致相同。

功能:分页显示特定sql查询结果,点击上一页下一页均可显示。单击某记录可以选定修改某特定字段<DropDownList可选项>点击Upadate按钮之后提交。

因为Repeater没有自带的分页功能,这里使用的是:AspNetPager.dll这个插件,首先引用到项目中,注册:

<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>
<webdiyer:AspNetPager ID="AspPage" runat="server" FirstPageText="FirstPage" LastPageText="LastPage"
                                    NextPageText="Next" OnPageChanged="AspPage_PageChanged" PageSize="10" PrevPageText="Prev">
                                </webdiyer:AspNetPager>

事件:AspPage_PageChanged,
后台代码:Page_Load事件,btnBack_Click点击返回键事件,以及AspPage_PageChanged事件中都要调用intopage()方法:

    protected void AspPage_PageChanged(object sender, EventArgs e)
    {
        intopage();
    }

AspNetPager插件的属性:CurrentPageIndex ,PageSize(设定为10).

注:不同于起始值为0的DataGrid控件的CurrentPageIndex和GridView控件的PageIndex属性,AspNetPager的CurrentPageIndex值是从1开始的。

以下是intopage()方法的实现代码:

    private void intopage()
    {
        this.AspPage.RecordCount = dcpu.GetCount();//获取sql记录总数
        this.Repeater1.DataSource = dcpu.GetCBProduct_CPUList(this.AspPage.CurrentPageIndex, AspPage.PageSize);//CurrentPageIndex:当前页索引值;PageSize:分页每页所能容纳值
        this.Repeater1.DataBind();
    }

调用的GetCBProduct_CPUList(int pageindex, int pagesize)方法:

public List<CBProduct> GetCBProduct_CPUList(int pageindex, int pagesize)
    {
        //string sql = string.Format("select top {0} * from [DMCD].[dbo].[CB_Product] where Part_Number not in(select top {1} Part_Number from [DMCD].[dbo].[CB_Product])", countpage, (page - 1) * countpage);
        string procedureName = "usp_SELECT_CBProductCPU_page";

        SqlParameter para1 = new SqlParameter("@I_PageIndex", SqlDbType.Int);
        para1.Direction = ParameterDirection.Input;
        para1.Value = pageindex;
        SqlParameter para2 = new SqlParameter("@I_PageSize", SqlDbType.Int);
        para2.Direction = ParameterDirection.Input;
        para2.Value = pagesize;
        SqlParameter[] paras={para1,para2};

        var result = DBUtility.ExecuteProcedure(procedureName, CommandType.StoredProcedure, DBServerType.PAP_Channel, paras);

        List<CBProduct> list = new List<CBProduct>();
        if (SqlHelper.ValidDataSetHasData(result))
        {
            var table = result.Tables[0];
            foreach (DataRow row in table.Rows)
            {
                CBProduct cbproduct = new CBProduct();
                cbproduct.part_number = row["Part_Number"].ToString();
                cbproduct.product_line_group = row["PRODUCT_LINE_GROUP"].ToString();
                cbproduct.bu_code = row["BU_Code"].ToString();
                cbproduct.include_in_amount = row["INCLUDE_IN_AMOUNT"].ToString();
                cbproduct.include_in_quantity = row["INCLUDE_IN_QUANTITY"].ToString();
                cbproduct.part_description = row["Part_Description"].ToString();
                cbproduct.create_ns = row["Create_NS"].ToString();
                cbproduct.cpu = row["CPU"].ToString();
                list.Add(cbproduct);
            }
        }
        return list;
    }

 正如上面注释的sql查询语句,如果是简单的查询整张表,并且表建立了主键索引,查询显示效率很快。

但是如果是复杂的查询,用这样的嵌套select语句就很慢,十几秒都不会完成。所以我这里选择的是建立Procedure查询,select查询出来的作为临时表<用IDENTITY(int,1,1)给临时表建立标识列>,将CurrentPageIndexPageSize作为参数传入,结果大大提高了效率。

以下是Procedure脚本:

USE [PCPDB]
GO

/****** Object:  StoredProcedure [dbo].[usp_SELECT_CBProductCPU_page]    Script Date: 2016/3/16 14:28:36 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:        Ammy.Guo
-- Create date: 2016-03-24
-- Description:    test asp.net repeater pagedepart 
-- =============================================
CREATE PROCEDURE [dbo].[usp_SELECT_CBProductCPU_page]
    -- Add the parameters for the stored procedure here
                @I_PageIndex  int,
                @I_PageSize   int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    
    SELECT  id=IDENTITY(int,1,1)
      ,DMProduct.[Part_Number]
      ,PRODUCT_LINE_GROUP
      ,DMProduct.[BU_Code]
      ,DMProduct.[INCLUDE_IN_AMOUNT]
      ,DMProduct.[INCLUDE_IN_QUANTITY]
      ,PCPDBProduct.Part_Description,PCPDBProduct.Create_NS,DMProduct.CPU    INTO #TEMP_CBProduct
  FROM [DMCD].[dbo].[CB_Product] as DMProduct
  inner join PCPDB.dbo.CB_PRODUCT as PCPDBProduct on DMProduct.[Part_Number] collate chinese_prc_ci_as  =PCPDBProduct.[Part_Number]
  left join PCPDB.dbo.CB_CPU as CPU_Table on DMProduct.CPU collate chinese_prc_ci_as =CPU_Table.CPU
  where DMProduct.PRODUCT_LINE_GROUP in ('Notebook','NetBook','Desktop','Tablet PC','Smart Handheld','Smart Handset','Server')
  and CPU_Table.[CPU_Brand] is null
  and DMProduct.[INCLUDE_IN_QUANTITY] = 'Yes'
  and DMProduct.Part_Number in (SELECT PART_NUMBER FROM [DMCD].[dbo].FS_CHANNEL_SELLOUT union SELECT PART_NUMBER FROM [DMCD].[dbo].FS_CHANNEL_INVENTORY)
  order by PRODUCT_LINE_GROUP,Part_Number
 

  SELECT [Part_Number]
      ,PRODUCT_LINE_GROUP
      ,[BU_Code]
      ,[INCLUDE_IN_AMOUNT]
      ,[INCLUDE_IN_QUANTITY]
      ,Part_Description
      ,Create_NS
      ,CPU  
      FROM #TEMP_CBProduct 
  WHERE id>=(@I_PageIndex-1)*@I_PageSize + 1 AND id<=(@I_PageIndex-1)*@I_PageSize + @I_PageSize

  --SELECT MAX(id) FROM #TEMP_CBProduct

  DROP TABLE #TEMP_CBProduct

END


GO

 

以下是页面效果:

END~~

 

posted @ 2016-03-16 14:34  依旧一生有你  阅读(1160)  评论(0编辑  收藏  举报