ASP.net 2.0 自定义控件的开发之数据分页 第三章

控件的属性及事件定义

  Private Shared ReadOnly EventibGotoPageClick As New Object()
        
Private Shared ReadOnly EventlbGotoPageClick As New Object()

        
Private Conn As SqlConnection
        
Private _StoredProcedureName As String
        
Private _ControlToDataBind As String
        
Private _GoToStyle As StyleGoTo = StyleGoTo.LinkButton

        
Private intPageCount As Int32 = 0
        
Private intRecordCount As Int32 = 0
        
Private intPageSize As Int32

        
Private _DefaultImageUrl As String
        
Private _HoverImageUrl As String
        
Private _PressedImageUrl As String

        
Private _controlToPaginat As Control
        
Private labPageInfo As Label
        
Private labPageInfoText_01 As Label
        
Private labPageInfoText_02 As Label
        
Private labPageInfoText_03 As Label
        
Private labPageInfoText_04 As Label

        
Private txtPageSize As TextBox
        
Private txtPageIndex As TextBox
        
Private ibGotoPage As ImageButton
        
Private lbGotoPage As LinkButton

        
Private lbFirstPage As LinkButton
        
Private lbPrevPage As LinkButton
        
Private lbNextPage As LinkButton
        
Private lbLastPage As LinkButton


属性定义

事件定义

 下面的代码用于控件的下拉列表属性页

Public Class StoredProcedureNameConverter
        
Inherits StringConverter
        
'存储过程 有兴趣可以添加你自己的存储过程
        '要用下拉列表编辑属性 
        Public Overrides Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean
            
Return True
        
End Function


        
'这个override返回下拉列表项。 
        Public Overrides Function GetStandardValues(ByVal context As ITypeDescriptorContext) As StandardValuesCollection
            
Dim StringArray As ArrayList = New ArrayList()
            StringArray.Add(
"sys_QuickSortPaging")
            StringArray.Add(
"sys_SortDataPager")
            
Return New StandardValuesCollection(StringArray)
        
End Function



        
'Return True的话只能选,Return flase可选可填 
        Public Overrides Function GetStandardValuesExclusive(ByVal context As ITypeDescriptorContext) As Boolean
            
Return True
        
End Function

    
End Class


    
Public Class ControlToDataBindConverter
        
Inherits StringConverter
        
'列出可以绑定的控件
        '要用下拉列表编辑属性 
        Public Overrides Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean
            
Return True
        
End Function


        
'这个override返回下拉列表项。 
        Public Overrides Function GetStandardValues(ByVal context As ITypeDescriptorContext) As StandardValuesCollection
            
Dim StringArray As ArrayList = New ArrayList()
            
Dim I As Long
            
Dim objControl As ControlCollection
            objControl 
= CType(context.Container.Components(0), Page).Controls
            
For I = 0 To objControl.Count - 1
                
If TypeOf objControl(I) Is GridView Or TypeOf objControl(I) Is DataList Then
                    StringArray.Add(objControl(I).ClientID)
                
End If
            
Next
            
Return New StandardValuesCollection(StringArray)
        
End Function



        
'Return True的话只能选,Return false可选可填 
        Public Overrides Function GetStandardValuesExclusive(ByVal context As ITypeDescriptorContext) As Boolean
            
Return False
        
End Function

    
End Class

存储过程 为 SQL Server 2000版本,请打开SQL server 2000 的查询分析器执行下面的SQL 语句。
程序用到的存储过程(仅支持主键排序)

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_QuickSortPaging]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[sys_QuickSortPaging]
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

CREATE PROCEDURE  sys_QuickSortPaging

    
@Table nvarchar(4000),            --表名(必须)
    @PrimaryKeyField nvarchar(50),        --表的主键字段
    @Field nvarchar (4000)='*',         --需要返回字段名(必须)        
    @Where nvarchar(1000)=NULL,        --Where 条件(可选)
             @GroupBy nvarchar(1000= NULL,     --分组
    @OrderBy nvarchar(1000)=NULL,     --排序用到的字段()
    @PageNumber int = 1,             --要返回的页(第X页) (默认为第一页)
    @PageSize int = 10,            --每页大小(默认为5)
    @RecordCount int output        --返回记录总数
)
AS 
    
SET NOCOUNT ON
    
DECLARE @SortTable nvarchar(100)
    
DECLARE @SortName nvarchar(100)
    
DECLARE @strSortColumn nvarchar(200)
    
DECLARE @Operator nvarchar(50)
    
DECLARE @Type varchar(100)
    
DECLARE @Prec int

    
IF @OrderBy IS NULL OR @OrderBy = ''
    
SET @OrderBy =  @PrimaryKeyField    
    
    
/* 获取用于定位的字段*/                
    
IF CHARINDEX('DESC',@OrderBy)>0                        
        
BEGIN
            
SET @strSortColumn = REPLACE(@OrderBy'DESC''')
            
SET @Operator = '<='
        
END
    
ELSE
        
BEGIN
            
IF CHARINDEX('ASC'@OrderBy= 0
            
SET @strSortColumn = REPLACE(@OrderBy'ASC''')
            
SET @Operator = '>='
        
END
    
    
IF CHARINDEX('.'@strSortColumn> 0                        
        
BEGIN
            
SET @SortTable = SUBSTRING(@strSortColumn0CHARINDEX('.',@strSortColumn))
            
SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@strSortColumn))
        
END
    
ELSE
        
BEGIN
            
SET @SortTable = @Table
            
SET @SortName = @strSortColumn
        
END

    
SELECT @Type=t.name, @Prec=c.prec
    
FROM sysobjects o 
    
JOIN syscolumns c on o.id=c.id
    
JOIN systypes t on c.xusertype=t.xusertype
    
WHERE o.name = @SortTable AND c.name = @SortName
    
    
IF CHARINDEX('char'@Type> 0
    
SET @Type = @Type + '(' + CAST(@Prec AS nvarchar+ ')'

    
DECLARE @strStartRow nvarchar(50)
    
DECLARE @strPageSize nvarchar(50)
    
DECLARE @strWhere nvarchar(1000)
    
DECLARE @strWhereAnd nvarchar(1000)
    
DECLARE @strGroupBy nvarchar(1000)

    
IF  @PageNumber < 1
    
SET @PageNumber = 1
    
    
SET @strPageSize = CONVERT (nvarchar(50), @PageSize)
    
SET @strStartRow = CONVERT ( nvarchar(50), (@PageNumber - 1)*@PageSize + 1)
    
    
IF @Where IS NOT NULL AND @Where !=''
    
BEGIN
        
SET @strWhere = ' WHERE '+ @Where 
        
SET @strWhereAnd= ' AND ' + @Where 
    
END
    
ELSE
    
BEGIN
        
SET @strWhere =  ''
        
SET @strWhereAnd=''
    
END
    
    
IF @GroupBy IS NOT NULL AND @GroupBy != ''
    
BEGIN
        
SET @strGroupBy = ' GROUP BY ' + @GroupBy
    
END
    
ELSE
    
BEGIN
        
SET @strGroupBy = ''
    
END

    
DECLARE @strSQL nvarchar(4000)
    
SET @strSql= ' SELECT  @RecordCount = Count (*)  FROM ' + @Table + @strWhere + ' '  + @strGroupBy
    
EXEC   sp_executesql   @strSql,N'@RecordCount   int   OUTPUT',@RecordCount   OUTPUT--计算总页数   

    
EXEC
        ( 
        
'
        DECLARE @Sort 
' + @Type + '
        SET ROWCOUNT 
' + @strStartRow + '
        SELECT  @Sort = 
' + @strSortColumn + '  FROM ' + @Table + @strWhere + ' '  + @strGroupBy + ' ORDER BY ' + @OrderBy + ' 
        SET ROWCOUNT 
' + @strPageSize + ' 
        SELECT 
'+@Field+'  FROM ' + @Table + ' WHERE ' + @strSortColumn  + @Operator  + ' @Sort ' + @strWhereAnd + ' '  + @strGroupBy + ' ORDER BY ' +  @OrderBy
        )
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

 支持任意字段排序的存储过程

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_SortDataPager]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[sys_SortDataPager]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE PROCEDURE sys_SortDataPager (
    
@Table nvarchar(4000),            --表名(必须)
    @PrimaryKeyField nvarchar(50),        --表的主键字段
    @Field nvarchar (4000)='*',         --需要返回字段名(必须)
    @Where nvarchar(1000)=NULL,        --Where 条件(可选)
    @GroupBy nvarchar(1000= NULL,     --分组
    @OrderBy nvarchar(1000)=NULL,     --排序用到的字段()
    @PageNumber int = 1,             --要返回的页(第X页) (默认为第一页)
    @PageSize int = 10,            --每页大小(默认为5)
    @RecordCount int out            --返回记录总数
)
AS

    
/*Find the @PrimaryKeyField type*/
    
DECLARE @PKTable varchar(1000)
    
DECLARE @PKName varchar(1000)
    
DECLARE @type varchar(1000)
    
DECLARE @prec int
    
    
IF CHARINDEX('.'@PrimaryKeyField> 0
        
BEGIN
            
SET @PKTable = SUBSTRING(@PrimaryKeyField0CHARINDEX('.',@PrimaryKeyField))
            
SET @PKName = SUBSTRING(@PrimaryKeyFieldCHARINDEX('.',@PrimaryKeyField+ 1LEN(@PrimaryKeyField))
        
END
    
ELSE
        
BEGIN
            
SET @PKTable = @Table
            
SET @PKName = @PrimaryKeyField
        
END
    
    
SELECT @type=t.name, @prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id    JOIN systypes t on c.xusertype=t.xusertype
    
WHERE o.name = @PKTable AND c.name = @PKName
    
    
IF CHARINDEX('char'@type> 0
    
SET @type = @type + '(' + CAST(@prec AS varchar+ ')'
    
    
DECLARE @strPageSize varchar(50)
    
DECLARE @strStartRow varchar(50)
    
DECLARE @strWhere varchar(1000)
    
DECLARE @strGroupBy varchar(1000)
    
    
/*Default Sorting*/
    
IF @OrderBy IS NULL OR @OrderBy = ''
    
SET @OrderBy = @PrimaryKeyField
    
    
/*Default Page Number*/
    
IF @PageNumber < 1
    
SET @PageNumber = 1
    
    
/*Set paging variables.*/
    
SET @strPageSize = CAST(@PageSize AS varchar(50))
    
SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1AS varchar(50))
    
    
/*Set filter & group variables.*/
    
IF @Where IS NOT NULL AND @Where != ''
        
SET @strWhere = ' WHERE ' + @Where + ' '
    
ELSE
        
SET @strWhere = ''
    
IF @GroupBy IS NOT NULL AND @GroupBy != ''
        
SET @strGroupBy = ' GROUP BY ' + @GroupBy + ' '
    
ELSE
        
SET @strGroupBy = ''
        
    
/*Execute dynamic query*/    
        
DECLARE @strSQL nvarchar(4000)
    
SET @strSql= ' SELECT  @RecordCount = Count (*)  FROM ' + @Table + @strWhere + ' '  + @strGroupBy
    
EXEC   sp_executesql   @strSql,N'@RecordCount   int   OUTPUT',@RecordCount   OUTPUT--计算总页数

    
EXEC(
    
'DECLARE @PageSize int
    SET @PageSize = 
' + @strPageSize + '
    
    DECLARE @PrimaryKeyField 
' + @type + '
    DECLARE @tblPK TABLE (
                PK  
' + @type + ' NOT NULL PRIMARY KEY
                )
    
    DECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FOR
    SELECT 
'  + @PrimaryKeyField + ' FROM ' + @Table + @strWhere + ' ' + @strGroupBy + ' ORDER BY ' + @OrderBy + '
    
    OPEN PagingCursor
    FETCH RELATIVE 
' + @strStartRow + ' FROM PagingCursor INTO @PrimaryKeyField
    
    SET NOCOUNT ON
    
    WHILE @PageSize > 0 AND @@FETCH_STATUS = 0
    BEGIN
                INSERT @tblPK (PK)  VALUES (@PrimaryKeyField)
                FETCH NEXT FROM PagingCursor INTO @PrimaryKeyField
                SET @PageSize = @PageSize - 1
    END
    
    CLOSE       PagingCursor
    DEALLOCATE  PagingCursor
    
    SELECT 
' + @Field + ' FROM ' + @Table + ' JOIN @tblPK tblPK ON ' + @PrimaryKeyField + ' = tblPK.PK ' + @strWhere + ' ' + @strGroupBy + ' ORDER BY ' + @OrderBy
    )
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

创建一个用于测试的表

CREATE TABLE [dbo].[Employees] (
    
[EmployeesID] [numeric](180IDENTITY (11NOT NULL ,
    
[LastName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    
[FirstName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    
[BirthDate] [datetime] NULL ,
    
[Address] [nvarchar] (60) COLLATE Chinese_PRC_CI_AS NULL ,
    
[City] [nvarchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,
    
[HomePhone] [nvarchar] (24) COLLATE Chinese_PRC_CI_AS NULL ,
    
[Extension] [nvarchar] (4) COLLATE Chinese_PRC_CI_AS NULL 
ON [PRIMARY]
GO

生成 1000000 条测试数据

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[InsertTableData]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[InsertTableData]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

CREATE PROCEDURE InsertTableData 
AS
DECLARE @cnt bigint
SET @cnt = 0
WHILE @cnt < 1000000
    
BEGIN
        
INSERT INTO Employees(LastName,FirstName,BirthDate,Address,City,HomePhone,Extension) 
        
Values
        (
        
CAST('LastName ' +CONVERT(nvarchar(10), @cntas nvarchar(30)),
        
CAST('FirstName '+  CONVERT(nvarchar(10), @cntas nvarchar(30)),
        
GETDATE(),
        
CAST('Address IS No.'+ CONVERT(nvarchar(10), @cntas nvarchar(30)),
        
CAST('City  '+ CONVERT(nvarchar(10), @cntas nvarchar(30)),        
        
CAST('021-0000'+ LEFT(CONVERT(nvarchar(10), @cnt),4as nvarchar(30)),
        
CAST('00' +  LEFT(CONVERT(nvarchar(10), @cnt) ,1as nvarchar(30))
        )
        
SET @cnt = @cnt + 1
    
END
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO


posted @ 2007-11-26 19:09  Nina  阅读(291)  评论(0编辑  收藏  举报