在自定义控件上,带有分页的转发器:执行 postback

分享于 

11分钟阅读

Web开发

  繁體

屏幕截图- repeater-with-paging1.gif

屏幕截图- repeater-with-paging2.gif

介绍

使用 out-of-the-box ASP.NET DataGrid 或者 GridView,通过分页来控制数据非常容易。 但是,缺点是要使分页工作正常,必须绑定所有的数据。 如果你有 1,000个数据行,并且你想只显示每页000个数据行,你就不希望将整个 1,000个数据行绑定在一起,只需要将分页设置为正常工作。

我写的这个控件继承自 Repeater,并为分页添加了一个 Literal 控件。 这里控件还实现了 IPostBackEventHandler,它允许你对服务器( 由 Literal 用于分页) 执行 postback。 这里控件允许只绑定要显示给用户的数据,但也使分页能够工作。

背景

本文仅针对那些在创建定制控件方面有经验的中级高级 ASP.NET 开发人员。 文件附加在 。vb文件中,你需要将这些文件添加到你自己的项目中。 在中如何创建类库项目 等等

这里控件将使用自定义 EventArgs 和委托和事件。 如果你不熟悉这些,你可能会感到困惑。

使用代码

从文件附件中,RepeaterWithPaging.vb。

  • 添加对 System.Web的引用。
  • 添加 导入 声明。
Imports System.Collections.GenericImports System.WebImports System.Web.UIImports System.Web.UI.WebControls
  • Repeater 继承并实现 IPostBackEventHandler 以允许 postback。
PublicClass RepeaterWithPaging _
 Inherits Repeater _
 Implements IPostBackEventHandler
  • 创建所需的类变量和属性。
#Region"Class Variables"Private litPaging As Literal 'THE LITERAL CONTROL FOR PAGINGPrivate intNumberOfData AsIntegerPrivate intNumberPerPage AsIntegerPrivate intCurrentPageNumber AsIntegerPrivate strPagingCssClass AsStringPublicEvent PagingClicked As PagingLiteralEventHandler#End Region#Region"Public Properties"'Used by the paging literal to display the page number from 1 to x'depending on the number of data specified here.PublicProperty NumberOfData() AsInteger 
 GetReturn intNumberOfData
 EndGetSet(ByVal Value AsInteger)
 intNumberOfData = Value
 EndSetEndProperty'The number of data displayed per page, used by paging literal as well.PublicProperty NumberPerPage() AsIntegerGetReturn intNumberPerPage
 EndGetSet(ByVal Value AsInteger)
 intNumberPerPage = Value
 EndSetEndProperty'Current page viewed.PublicProperty CurrentPageNumber() AsIntegerGetReturnMe.intCurrentPageNumber
 EndGetSet(ByVal value AsInteger)
 Me.intCurrentPageNumber = value
 EndSetEndProperty'The CSS class for the paging literalPublicProperty PagingCssClass() AsStringGetReturnMe.strPagingCssClass
 EndGetSet(ByVal value AsString)
 Me.strPagingCssClass = value
 EndSetEndProperty#End Region
  • IPostBackEventHandler 实现所需的方法。 这里方法在由分页触发 postback 时调用。 我稍后再解释。
PublicSub RaisePostBackEvent(ByVal eventArgument AsString) _
 Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEventEndSub
  • 创建一个委托以通过分页文本处理 postback 事件。
PublicDelegateSub PagingLiteralEventHandler(ByVal sender AsObject, _
 ByVal ev As PagingLiteralEventArgs)
  • 基于该委托创建事件。
PublicEvent PagingClicked As PagingLiteralEventHandler
  • PagingLiteralEventArgs 类是在文件 PagingLiteralEventArgs.vb 中定义的。 这里文件从 EventArgs 类继承,并且它具有 public 属性 CurrentPage。 使用 EventArgs,你可以传递参数。 你可以添加尽可以能多的参数,但是对于分页文本控件,我们只需要用户查看的CurrentPage 属性。
PublicClass PagingLiteralEventArgs
 Inherits EventArgs#Region"Class Variables"Private intCurrentPage AsInteger#End Region#Region"Public Properties"PublicProperty CurrentPage() AsIntegerGetReturn intCurrentPage
 EndGetSet(ByVal Value AsInteger)
 intCurrentPage = Value
 EndSetEndProperty#End RegionEndClass
  • 回到 RepeaterWithPaging.vb。 我们现在需要初始化用于分页的Literal。 让我们重写基类的OnInit 方法,并且当页面未回发时,我们将当前页号设置为 1.
ProtectedOverridesSub OnInit(ByVal e As System.EventArgs)
 MyBase.OnInit(e)
 litPaging = New Literal
 Me.Controls.Add(litPaging) 'Add to control collectionIfNotMe.Page.IsPostBack ThenMe.intCurrentPageNumber = 1EndIfEndSub
  • 填充分页文字。我想强调以下方法:
Me.Page.ClientScript.GetPostBackEventReference(Me, i)

这里方法是触发 postback的方法 ! 你可以将这里方法添加为JavaScript调用,如果在 IE 或者 Firefox 中查看源,则可以看到它呈现为 _doPostBack()。 这里方法传递两个输入参数: 调用控件和参数。 通过 作为控件和页码( 表示方式" i"- 查看下面的方法) 将单击的页码作为参数传递。

然后,这里方法将由前面解释的接口实现:

RaisePostBackEvent(ByVal eventArgument AsString)

eventArgument 变量将包含传递的参数。

PrivateSub PopulatePaging()
 'Number of pages is obtained by dividing number of data with number per pageDim intNoOfPages AsInteger = Me.NumberOfData/Me.NumberPerPage
 'If there is still extra data'e.g Number of data is 303 and number per page is 100'there are still 3 items left after page 3, so add page by 1.IfMe.NumberOfData ModMe.NumberPerPage> 0Then intNoOfPages += 1EndIf'Display paging from 1 to number of pagesFor i AsInteger = 1To intNoOfPages
 'If user navigates to the current page, make it bold.If i = Me.intCurrentPageNumber ThenMe.litPaging.Text &= "<a class=""" & _
 Me.PagingCssClass & """ href=""#"" onclick=""" & _
 Me.Page.ClientScript.GetPostBackEventReference(Me, i) & _
 """><b>" & i & "</b></a> |"Else'Make it normalMe.litPaging.Text &= "<a class=""" & Me.PagingCssClass & _
 """ href=""#"" onclick=""" & _
 Me.Page.ClientScript.GetPostBackEventReference(Me, i) & """>" & _
 i & "</a> |"EndIfNextEndSub
  • RaisePostBackEvent() ,触发前面声明的PagingClicked 事件。 这意味着当在页面文本上单击文本时,PagingClicked事件被触发。 然后,我们传递通过 eventArgument 变量传递的页码参数。
PublicSub RaisePostBackEvent(ByVal eventArgument AsString) _
 Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
 'This is the power of custom EventArgs, you can pass it as an argumentDim objEventArgs AsNew PagingLiteralEventArgs
 objEventArgs.CurrentPage = CInt(eventArgument)
 Me.intCurrentPageNumber = eventArgument
 'Raise the event with passing the custom PagingLiteralEventArgsRaiseEvent PagingClicked(Me, objEventArgs)EndSub
  • 同时呈现 RepeaterLiteral
ProtectedOverridesSub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
 MyBase.Render(writer)
 writer.Write("<p/>")
 Me.PopulatePaging()
 Me.litPaging.RenderControl(writer)EndSub

好了现在,我们进入前端ASPX页面。

前端

  • register 自定义控件。
<%@RegisterTagPrefix="CRE"Namespace="ContentReadyEnterprise.Web.Controls"Assembly="ContentReadyEnterprise.Web.Controls"%>
  • 将自定义转发器声明为普通转发器,但请注意我们前面创建的自定义属性和事件。 创建基于自定义委托( 在这种情况下,PagingClicked )的新事件时,Visual Studio 会在它的前面自动添加"打开"词 ! 非常好当你从ASPX查看 Repeater的属性时,你可以看到 OnPagingClicked 事件是在 !
<CRE:RepeaterWithPagingID="rptTest"runat="server"OnPagingClicked="Paging_Clicked"NumberOfData="100"NumberPerPage="10"><ItemTemplate><%#Container.DataItem%><br/></ItemTemplate></CRE:RepeaterWithPaging>
  • 在后面的代码中,让我们捕获 Paging_Clicked 事件。
ProtectedSub Paging_Clicked(ByVal sender AsObject, ByVal ev As PagingLiteralEventArgs)
 Response.Write("I click page number:" & ev.CurrentPage.ToString())EndSub
  • 绑定测试数据并测试分页。
ProtectedSub Page_Load(ByVal sender AsObject, _
 ByVal e As System.EventArgs) HandlesMe.Load
 IfNot Page.IsPostBack ThenMe.GetTestData()
 EndIfEndSub'Capture paging event ProtectedSub Paging_Clicked(ByVal sender AsObject, _
 ByVal ev As PagingLiteralEventArgs)
 Me.GetTestData()EndSub'You can write your own method here.PrivateSub GetTestData()
 Dim alistTest AsNew List(OfString)
 Dim intStartNumber AsInteger = _
 rptTest.CurrentPageNumber * rptTest.NumberPerPage
 If rptTest.CurrentPageNumber = 1Then intStartNumber = 1EndIfDim intEndNumber AsInteger = intStartNumber + rptTest.NumberPerPage
 For i AsInteger = intStartNumber To intEndNumber
 alistTest.Add(i)
 Next rptTest.DataSource = alistTest
 rptTest.DataBind()EndSub

就是这样 !

Points of Interest

看一个可以做 postback的控件很有意思。


控制  rep  pos  PERF  POST  Paging  
相关文章