当前位置:编程学习 > C#/ASP.NET >>

DataGridView分页问题

DGV是绑定的数据源“DataTable”,如果“dt”也就是数据库中的表中的数据量比较大的话,如果还只是直接绑定,而不进行分页。是不是会浪费资源,而影响性能呢?

如果要进行分页,请问应该怎样做?
能给点实例或是源码吗? --------------------编程问答-------------------- 前台
用apsnetpager控件,上网上自己下一个


 <webdiyer:AspNetPager ID="AspNetPager1" CssClass="anpager" CurrentPageButtonClass="current"
                                                                                            runat="server" FirstPageText="首页" LastPageText="尾页" NextPageText="后页" OnPageChanging="AspNetPager1_PageChanging"
                                                                                            PageIndexBoxType="DropDownList" PrevPageText="前页" ShowPageIndexBox="Always" SubmitButtonText="Go"
                                                                                            TextAfterPageIndexBox="页" TextBeforePageIndexBox="转到">
                                                                                        </webdiyer:AspNetPager>
--------------------编程问答--------------------
引用 1 楼 changling_wang 的回复:
前台
用apsnetpager控件,上网上自己下一个

HTML code

 <webdiyer:AspNetPager ID="AspNetPager1" CssClass="anpager" CurrentPageButtonClass="current"
                                                               ……
    顶。。。 --------------------编程问答-------------------- 你是c#吗?那我做了一个分页控件,有源码 --------------------编程问答-------------------- 用存储过程在数据库中实现分页查询
--------------------编程问答-------------------- 后台

    protected void AspNetPager1_PageChanging(object src, Wuqi.Webdiyer.PageChangingEventArgs e)
    {
        AspNetPager1.CurrentPageIndex = e.NewPageIndex;
        this.gvBind(txtSeachArea.Text.Trim());
    }
//load方法里
   if (!Page.IsPostBack)
        {
            this.AspNetPager1.PageSize = 10;
            gvBind("");//数据邦定方法
        }

public void gvBind("")
{
  string parName = "Proc_SplitPage";//存储过程名
        SqlParameter[] param = {
                                   new SqlParameter("@RowsCount",SqlDbType.Decimal,32),//[总条数]
                                   new SqlParameter("@PageCount",SqlDbType.Decimal,32),//[总页数]
                                   new SqlParameter("@PageIndex",SqlDbType.Decimal,32),//[要显示的页码]
                                   new SqlParameter("@TopNum",SqlDbType.Decimal,32),//[每页显示的条数]
                                   new SqlParameter("@ColsName",SqlDbType.VarChar,5000),//[列名]
                                   new SqlParameter("@ColsNameFact",SqlDbType.VarChar,5000),//[构造后的列名]
                                   new SqlParameter("@TableName",SqlDbType.VarChar,5000),//[表名]
                                   new SqlParameter("@Term",SqlDbType.VarChar,5000),//[条件]
                                   new SqlParameter("@Group",SqlDbType.VarChar,5000),//[是否分组]
                                   new SqlParameter("@OrderCols",SqlDbType.VarChar,5000),//[排序 排序方式]
                                 };

 this.AspNetPager1.RecordCount = pagecount;
        param[0].Value = pagecount;
        if (pagecount % int.Parse(this.dropRowsPage.SelectedValue) > 0)
        {
            param[1].Value = pagecount / int.Parse(this.dropRowsPage.SelectedValue) + 1;
        }
        else
        {
            param[1].Value = pagecount / int.Parse(this.dropRowsPage.SelectedValue);
        }
    param[2].Value = this.AspNetPager1.CurrentPageIndex;
        param[3].Value = this.AspNetPager1.PageSize;
        param[...].Value = ....;
            dtFiles = Data.SQLHelper.ProQuery(parName, param).Tables[0];//给你的dgv赋数据源
}
--------------------编程问答-------------------- 比如先定好每页100条记录,那么通过存储过程每次就只查询100条绑定到gridview,点击下页或者页数时候再进行一次查询绑定,在存储过程中需要传递一个第几页的输入参数 --------------------编程问答-------------------- 数据库存储过程

USE [DB]
GO

/****** Object:  StoredProcedure [dbo].[Proc_SplitPage]    Script Date: 11/10/2010 16:50:15 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


/*测试语句

EXEC Proc_SplitPage 
@RowsCount=22,@PageCount=5,@PageIndex=4,@TopNum=5,
@ColsName='u.ID,u.UserID,u.UserName,u.UserShowName,l.Remark',
@TableName='tb_UserInfo u left join tb_UserLog l on u.UserID=l.UserID',
@Term='u.ID>''1''',
@Group='1',
@OrderCols='u.ID ASC'

EXEC Proc_SplitPage 
@RowsCount=22,@PageCount=5,@PageIndex=4,@TopNum=5,
@ColsName=' u.UserName,u.UserShowName,ci.ImgUrl,
            vfs.FileID,vfs.SharingCount, v.CreateUser ',
@TableName='view_Files v 
                    left join view_FileSharing vfs on v.directID=vfs.FileID  
                    left join dbo.tb_UserInfo u on v.CreateUser=u.UserID 
                    left join dbo.tb_ClsImg ci on LOWER(v.fileExtension)=LOWER(ci.cls)',
@Term='v.parentID=''1546''',
@Group='1',
@OrderCols='v.Sort DESC,v.dirOrder DESC,v.UpdateTime DESC'
GO

select u.ID,u.UserID,u.UserName,u.UserShowName,l.Remark 
from tb_UserInfo u left join tb_UserLog l on u.UserID=l.UserID 
WHERE u.UserID>1 
GROUP BY u.ID,u.UserID,u.UserName,u.UserShowName,l.Remark 
ORDER BY U.ID ASC

SELECT * FROM (SELECT TOP 5 ID,UserID,UserName,UserShowName,Remark FROM (SELECT TOP 7 u.ID,u.UserID,u.UserName,u.UserShowName,l.Remark FROM tb_UserInfo u left join tb_UserLog l on u.UserID=l.UserID WHERE u.ID>'1' GROUP BY u.ID,u.UserID,u.UserName,u.UserShowName,l.Remark ORDER BY u.ID DESC) AS tb_DL ORDER BY ID ASC) AS tb_Return ORDER BY ID ASC

GO
*/

ALTER PROC [dbo].[Proc_SplitPage] 
@RowsCount DECIMAL(32,3), --[总条数]
@PageCount DECIMAL(32,3), --[总页数]
@PageIndex DECIMAL(32,3), --[要显示的页码]
@TopNum DECIMAL(32,3), --[每页显示的条数]
@ColsName VARCHAR(5000), --[列名]
@ColsNameFact VARCHAR(5000),--[]
@TableName VARCHAR(5000), --[表名]
@Term VARCHAR(5000), --[条件]
@Group VARCHAR(5000), --[是否分组]
@OrderCols VARCHAR(5000) --[排序 排序方式]
AS
DECLARE 
@Exec VARCHAR(5000), --[要执行的SQL字符串]
@ExecPart VARCHAR(5000), --[截取的部分SQL字符串]
@ASC VARCHAR(50), --[正常排序字段]
@ASCPart VARCHAR(50), --[相反排序字段]
@TopNumPart DECIMAL(32,3), --[核心层筛查出的条数]
@PageMide DECIMAL(32,3), --[中间页码]
@LastPageRows DECIMAL(32,3) --[最后一页的条数]

/*设置 [要执行的SQL字符串][截取的部分SQL字符串]的默认值*/
SET @Exec=''
SET @ExecPart=''

/*计算[中间页码]*/
SET @PageMide=(@RowsCount/cast(@TopNum as decimal(32,3))/2)+1

if(@PageIndex<=0)
Begin
set @PageIndex=1
end
if(@PageIndex>@PageCount)
begin
set @PageIndex=@PageCount
end


/*
取之顺序:
如果[要显示的页码]大于[中间页码],则 倒取--正取--排序;
如果[要显示的页码]小于[中间页码],则 正取--倒取--排序
*/
IF CAST(@PageIndex AS DECIMAL(32,3))>@PageMide 
BEGIN
SET @TopNumPart=@RowsCount-((@PageIndex-1)*@TopNum)
--PRINT '倒序'+CAST(@TopNumPart AS VARCHAR(500))
SET @ASCPart=@OrderCols
SET @ASC=@OrderCols 
SET @ASC=REPLACE(@ASC,'ASC','@@@')
SET @ASC=REPLACE(@ASC,'DESC','ASC')
SET @ASC=REPLACE(@ASC,'@@@','DESC')
END
ELSE
BEGIN
SET @TopNumPart=@PageIndex*@TopNum
--PRINT '正序'+CAST(@TopNumPart AS VARCHAR(500))
SET @ASC=@OrderCols
SET @ASCPart=@OrderCols 
SET @ASCPart=REPLACE(@ASCPart,'ASC','@@@')
SET @ASCPart=REPLACE(@ASCPart,'DESC','ASC')
SET @ASCPart=REPLACE(@ASCPart,'@@@','DESC')
END

IF LEN(@ColsName)>0
BEGIN
/*构造核心层的SQl语句*/
SET @ExecPart='SELECT TOP '+CAST(CAST(@TopNumPart AS INT) AS VARCHAR(500))+' '
SET @ExecPart=@ExecPart+@ColsName+' FROM '+@TableName 
SET @ExecPart=@ExecPart+' WHERE 1=1 '+@Term
IF @Group='1'
BEGIN
SET @ExecPart=@ExecPart+' GROUP BY '+@ColsName
END
SET @ExecPart=@ExecPart+' ORDER BY '+@ASC
/*构造中间层的SQL语句*/
SET @Exec='SELECT TOP '+CAST(CAST(@TopNum AS INT) AS VARCHAR(500))+' '+dbo.FUN_OnlyColsName(@ColsName)
SET @Exec=@Exec+' FROM ('+@ExecPart+') AS tb_DL'
SET @Exec=@Exec+' ORDER BY '+ dbo.FUN_OnlyColsName(@ASCPart)
/*构造最外层的SQL语句*/
SET @Exec='SELECT '+@ColsNameFact+' FROM ('+@Exec+') AS tb_Return ORDER BY '+dbo.FUN_OnlyColsName(@OrderCols)
END
PRINT @Exec
EXECUTE (@Exec)

GO



--------------------编程问答-------------------- 在页面上分页会占用系统内存,如果数据量巨大估计加载数据的时间都够呛的 --------------------编程问答-------------------- SELECT TOP 每页记录数 * FROM 表名
WHERE id NOT IN
(
    SELECT TOP 每页记录数 * 当前页码 id
)

如果用LinqToSQL查询就用.Take(每页记录数).Skip(页数) --------------------编程问答-------------------- --------------------编程问答-------------------- dbo.FUN_OnlyColsName()这个Function的代码呢?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,