`
varsoft
  • 浏览: 2439766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Asp.net中DataGrid控件的自定义分页

阅读更多

使用实现起来虽然比较方便,但是效率不高,每次都需要读取所有页(整个记录集),而加载的只是其中一页,造成了资源的浪费,记录多又会使效率变得很低。下面通过DataGrid的自定义分页功能来减少资源使用和提高效率。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

实现的关键是设置AllowCustomPaging属性位True,并把VirtualItemCount属性设置位总的记录数,给分页提供依据,前台的主要代码如下:

<form id="Form1" method="post" runat="server">

<TABLE id="Table1" style="FONT-SIZE: <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv w:st="on" unitname="pt" sourcevalue="9" hasspace="False" negative="False" numbertype="1" tcsc="0">9pt</chmetcnv>" cellSpacing="1" cellPadding="1" width="450" align="center"

border="1">

<TR>

<TD>

<asp:datagrid id="DataGrid1" runat="server" Width="100%" AllowPaging="True" AllowCustomPaging="True">

<PagerStyle Font-Size="<chmetcnv w:st="on" unitname="pt" sourcevalue="9" hasspace="False" negative="False" numbertype="1" tcsc="0">9pt</chmetcnv>" Mode="NumericPages"></PagerStyle>

</asp:datagrid></TD>

</TR>

</TABLE>

</form>

这里使用的数据源还是假设为NorthwindCustomers表。

下面是访问单页的存储过程,实现方式很多,不过这个是最普通的,

CREATE PROCEDURE [GetCustomersDataPage]

@PageIndex INT,

@PageSize INT,

@RecordCount INT OUT,

@PageCount INT OUT

AS

SELECT @RecordCount = COUNT(*) FROM Customers

SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)

DECLARE @SQLSTR NVARCHAR(1000)

IF @PageIndex = 0 OR @PageCount <= 1

SET @SQLSTR =N'SELECT TOP '+STR( @PageSize )+

' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID DESC'

ELSE IF @PageIndex = @PageCount - 1

SET @SQLSTR =N' SELECT * FROM ( SELECT TOP '+STR( @RecordCount - @PageSize * @PageIndex )+

' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID ASC ) TempTable ORDER BY CustomerID DESC'

ELSE

SET @SQLSTR =N' SELECT TOP '+STR( @PageSize )+' * FROM ( SELECT TOP '+STR( @RecordCount - @PageSize * @PageIndex )+

' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID ASC ) TempTable ORDER BY CustomerID DESC'

EXEC (@SQLSTR)

GO

获取记录数和页数都采用存储过程的输出参数。

获取数据源,这里返回一个DataSet

先定义了连个数据成员,

private int pageCount;//页数

private int recordCount;//记录数

//获取单页数据

private static DataSet GetCustomersData(int pageIndex,int pageSize,ref int recordCount,ref int pageCount)

{

string connString = ConfigurationSettings.AppSettings["ConnString"];

SqlConnection conn = new SqlConnection(connString);

SqlCommand comm = new SqlCommand("GetCustomersDataPage",conn);

comm.Parameters.Add(new SqlParameter("@PageIndex",SqlDbType.Int));

comm.Parameters[0].Value = pageIndex;

comm.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));

comm.Parameters[1].Value = pageSize;

comm.Parameters.Add(new SqlParameter("@RecordCount",SqlDbType.Int));

comm.Parameters[2].Direction = ParameterDirection.Output;

comm.Parameters.Add(new SqlParameter("@PageCount",SqlDbType.Int));

comm.Parameters[3].Direction = ParameterDirection.Output;

comm.CommandType = CommandType.StoredProcedure;

SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);

DataSet ds = new DataSet();

dataAdapter.Fill(ds);

recordCount = (int)comm.Parameters[2].Value;

pageCount = (int)comm.Parameters[3].Value;

return ds;

}

//绑定数据到DataGrid,同时刷新数据总记录数

private void DataGridDataBind()

{

DataSet ds = GetCustomersData(PageIndex,PageSize,ref recordCount,ref pageCount);

this.DataGrid1.VirtualItemCount = RecordCount;

this.DataGrid1.DataSource = ds;

this.DataGrid1.DataBind();

}

下面是分页的几个变量属性

public int PageCount

{

get{return this.DataGrid1.PageCount;}

}

public int PageSize

{

get{return this.DataGrid1.PageSize;}

}

public int PageIndex

{

get{return this.DataGrid1.CurrentPageIndex;}

set{this.DataGrid1.CurrentPageIndex = value;}

}

public int RecordCount

{

get{return recordCount;}

}

注册DataGrid分页事件

//分页事件处理

private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)

{

DataGrid dg = (DataGrid)source;

dg.CurrentPageIndex = e.NewPageIndex;

DataGridDataBind();

}

最好判断当前页面是否是第一次加载,防止重复加载两次数据,

private void Page_Load(object sender, System.EventArgs e)

{

if(!Page.IsPostBack)

{

DataGridDataBind();

}

}

显示界面如下:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>


这个例子中没有显示分页的一些参数,我们可以进一步对其进行改进。

分享到:
评论

相关推荐

    自定义asp.net中DataGrid的一个分页控件

    自定义asp.net中DataGrid的一个分页控件。。 在winform下实现。。。其实有了思路哪儿写都一样O(∩_∩)O哈哈~

    .NET 通用分页控件

    在ASP.NET中,虽然自带了一个可以分页的DataGrid(asp.net 1.1)和GridView(asp.net 2.0)控件,但其分页功能并不尽如人意,如可定制性差、无法通过Url实现分页功能等,而且有时候我们需要对DataList和Repeater甚至...

    asp.net中DataList,DataGrid中的分页控件dll

    DataList,DataGrid中的分页dll

    ASP.net中大结果集的分页

    传统的asp里这并不是一个简单的任务,但在asp.net中,DataGrid控件把这一过程简化为只有 几行代码。因此,在 asp.net中,分页很简单,但是默认的DataGrid分页事件会从数据库中把所 有的记录全部读出来放到asp.net ...

    ASP.Net皮肤换肤控件

    在ASP.NET中,虽然自带了一个可以分页的DataGrid(asp.net 1.1)和GridView(asp.net 2.0)控件,但其分页功能并不尽如人意,如可定制性差、无法通过Url实现分页功能等,而且有时候我们需要对DataList和Repeater甚至...

    基于ASP.NET的自定义分页显示

    基于ASP.NET的自定义分页显示,针对WEB数据库记录的显示问题,用实例讨论了在ASP.NET框架下使用DataGrid控件对数据库记录的一种自定义分页显示

    Ajax+JQuery 封装的Asp.NET版DataGrid控件

    .NET源码,控件组件,GridView,DataGrid Ajax+JQuery 版DataGrid控件,GridView数据显示比较不错的选择,本控件含源代码,JQuery的引入使其功能更加人性化,比如可以拖动改变列宽,双击标头排序,无刷新分页等,...

    Asp.net分页控件AspNetPager7.2

    在ASP.NET中,虽然自带了一个可以分页的DataGrid(asp.net 1.1)和GridView(asp.net 2.0)控件,但其分页功能并不尽如人意,如可定制性差、无法通过Url实现分页功能等,而且有时候我们需要对DataList和Repeater甚至...

    c#asp.net分页专业用于Aspnet分页控件

    应用VS2005开发工具,用c#语言编写后台的asp.net程序。对datagrid进行分页。简单易用。

    ASP.NET基础控件-教程

    内容:  Asp.net页面内传参数方法  调用存储过程(两种方法比较) ... Asp.net中DataList控件添加删除  Asp.net获取请求的用户信息IP地址  获取世界IP地址库显所在城市信息  MySQL事务处理  SQL内部常用函数

    ASP.NET常见问题集锦.zip

    ASP.NET中自定义控件的创建和使用.doc ASP.NET实现用户在线检测的类源码.txt ASP.NET常见问题集锦.zip ASP.NET弹出式日历选择控件的实现.doc ASP.NET程序中常用的三十三种代码.txt ASP.NET页面间数据传递小结....

    在Asp.net中使用DataGrid分页

    此实例程序使用DataGrid控件的AllowPaging属性可以为Web页面很方便地实现页面功能

    asp.net下Repeater使用 AspNetPager分页控件

    一、AspNetPager分页控件 分页是Web应用程序中最常用到的功能之一,在ASP.NET中,虽然自带了一个可以分页的DataGrid(asp.net 1.1)和GridView(asp.net 2.0)控件,但其分页功能并不尽如人意,如可定制性差、无法...

    能用漂亮分页控件及Demo源码

    AspNetPager支持使用主题(Theme)与皮肤(Skin)统一控件的整体样式,配合asp.net 2.0中的DataSource控件,AspNetPager只需要编写短短几行代码,甚至无需编写任何代码,只需设置几个属性就可以实现分页功能。...

    ASP.NET分页控件

    AspNetPager42 分页控件支持DataGrid分页 DataList分页 Repeater分页 查询分页

    asp.net开发常用整理集合

    不断更新中 ... Asp.net中DataList控件添加删除  Asp.net获取请求的用户信息IP地址  获取世界IP地址库显所在城市信息  MySQL事务处理  SQL内部常用函数  为gridview“删除”列添加确认对话框

    asp.net 仿PetShop的Reapter控件分页功能

    使用.net 2003和MS SQL ...尽管.net中已经提供了一些控件实现了自动的分页功能,但我自己感觉要想真正成为编程高手,不仅仅懂得去用,还应该了解运行的原理和机制。像DataGrid等其他控件的分页功能,应该是这个原理!

    asp.net web 分页控件

    可以对于datagrid,repeater,datalist,进行快速分页 ,据说存储过程支持千万级数据库,没有测试过。 代码写起来很方便。 附带上数据库的存储过程。希望大家下载。

    asp.net 快速通用分页空间

    asp.net在快速分页控件。把源码发给大家,以便大家学习,改进。 基于sqlserver 2000存储过程 分页速度快。使用方便 实现了repeater ,datalist ,datagrid,gridview的重载。

Global site tag (gtag.js) - Google Analytics