{A}简介
DataPager的是一个自定义的控制,重视数据控件(如一个GridView,ListView中,DataList中,中继器),允许分页控制。
将DataPager本身显示quot; Firstquot;,"Nextquot;,"Previousquot;和"; Lastquot";按钮(或数值的网页或自定义的组合)NBSP,你按一下按钮寻呼机提供和你数据控制会自动通过使用SQL Paging.nbsp的数据页;
只需拖放的DataPager和一ornbsp;两行代码在您的aspx.cs页面。{S0}用户控制的问题与事件处理
用户控件有很多好处??他们让你抽象的一组常用的控件到一个单一的,可重复使用的控制。有时,会有一个企业需要通过用户之间的控制和其包含的ASP.NET网页的数据。例如,您可能有一个地址控制,在加载页面时,它设置地址控制的街道,城市,和国有资产。然而,当它足够简单的aspx页面触发一个用户控件的方法,它不是简单的用户控制,相反其包含的页面的触发方法。背景
SQL分页意味着它实现了超高效数据分页,2005年在SQL中使用新的ROW_NUMBER()(这是免费的SQL Express版本最多支持)和新的ASP.NET 2.0的GridView / ObjectDataSource的controls.nbsp;
示例SQL Server的分页查询:
使用代码With RecordEntries as (
SELECT ROW_NUMBER() OVER (ORDER BY [OrderByField) as Row,
FROM [TableName]
)
Select * FROM RecordEntries
WHERE Row between @startRowIndex and @endRowIndex
当你把aspx页面的控制,那么你可以设置DataPager控件的下列属性:
现在,添加以下行。aspx.cs文件中的代码:
代表最终需求,为用户控件能够调用一个方法,即我们希望通过它的方法参考,并让它调用该方法就其本身而言。这正是一个代表让我们做。根据MSDN中,委托quot;是一种数据结构,是指一个静态方法或一个类的实例,一个实例方法,class.quot;
换句话说,你可以指定一个方法引用到一个委托,并通过类似的,你如何通过其他类型。我们将解决与记录导航器在介绍中提到的问题,我们的示例解决方案的问题。在这个例子中,有一个WebForm包含一个用户控制。在这种情况下用户控件包含两个属性,一个代表业务数据??作为一个整数索引。在webform一个BindGrid()方法来填充数据,然后填充页面适当控制。 WebForm中创建了一个委托,它是指BindGrid()方法,并传递该委托用户控件的委托型物业。每当使用者控制项的上一个或下一个按钮被点击,然后调用它,从选择用户控制(在这种情况下,只是指数)的数据值传递的委托。最后,在打开的委托触发父页面的BindGrid()方法。
技术实现
现在,我们有一个高层次的理解,我们想要做什么,让我们的代码。首先,我们要创建的用户控制。创建一个用户控件名为DataPager.ascx itnbsp添加以下两个属性(代码是非常自我解释):
{S2}
aspx.cs页面包含thenbsp;下面的代码:
程序的流程
在最初的WebForm负荷,相关的控制流开始的WebForm的Page_Load,并设置用户控件的属性。它只需要设置业务数据(如页面索引)第一次,因为这些数据是序列化和页的ViewState仍然存在。它设置后,每次回发委托财产,因为委托是不是默认情况下的ViewState序列化并保存。的WebForm的Page_Load后,用户控制的Page_Load被调用。这台默认的商业价值(存储在用户控件的属性),然后调用UpdatePageIndex()方法。if (!IsPostBack)
{
BindGrid(1);
}
delPopulateData delPopulate = new delPopulateData(this.BindGrid);
pagerApps.UpdatePageIndex = delPopulate;
这种方法更新用户控件的GUI反映的价值观,和然后从属性获取委托引用,并调用该方法,触发父页面上更新数据。当用户点击RecordIndex上一个或下一个按钮,他们更新适当的内部业务数据,然后调用UpdatePageIndex()方法,该方法更新父页面,只是前面所述。控制流几乎是相同的回传的吗??除了默认的业务数据不被复位。SQL服务器分页逻辑
下面的存储过程只返回那些通过使用参数的记录:
摘要--EXEC [GetAppsDetails] 1,10
ALTER PROCEDURE [dbo].[GetAppsDetails]
@PageIndex INT,
@RecordsPerPage INT
AS
BEGIN
SET NOCOUNT ON
Declare @startRowIndex INT;
Declare @endRowIndex INT;
set @endRowIndex = (@PageIndex * @RecordsPerPage);
set @startRowIndex = (@endRowIndex - @RecordsPerPage) + 1;
With RecordEntries as (
SELECT ROW_NUMBER() OVER (ORDER BY A.APP_TYPE_ID ASC) as Row, _
A.APP_TYPE_ID,
A.APP_TYPE_NAME,A.APP_STORE_ID,R.REVIEW_TITLE,R.AUTHOR_NAME,_
R.REVIEW_DATE,
R.REVIEW_RATING,R.REVIEW_TEXT FROM [dbo].[APP_TYPES] A
INNER JOIN [CUSTOMER_APP_REVIEWS] R ON A.APP_TYPE_ID=R.APP_TYPE_ID
)
Select APP_TYPE_ID, APP_TYPE_NAME, APP_STORE_ID, REVIEW_TITLE, AUTHOR_NAME,
REVIEW_DATE, REVIEW_RATING, REVIEW_TEXT
FROM RecordEntries
WHERE Row between
@startRowIndex and @endRowIndex
SELECT COUNT(*) FROM [dbo].[APP_TYPES] A
INNER JOIN [CUSTOMER_APP_REVIEWS] R ON A.APP_TYPE_ID=R.APP_TYPE_ID
END
用户控制Web应用程序提供了许多好处。这些优点的部分是一个WebForm和用户控件之间的数据传递两种方式。虽然是微不足道的数据传递给用户控制,用户控制传递回页面是没有的。但是,我们仍然可以解决这个页面实例化一个委托,并传递给用户控制,用户控制的能力上的需求触发父页面的方法。
如果没有数据源是否存在,然后DataPager的看起来像:的兴趣点
我会尝试开发一个不需要任何一行代码,像控制:
历史public delegate void delPopulateData(int myInt);
delPopulateData delPopulate = new delPopulateData(this.BindGrid);
pagerApps.UpdatePageIndex = delPopulate;
如果你发现一些问题或错误,刚刚发表评论或丢弃我的电子邮件。如果你对此有何注意事项,让我知道,太使我没有重做你们的辛勤工作。请提供一个quot; Votequot;如果这将是有益的的。