自定义模板化页导航控件

分享于 

9分钟阅读

Web开发

  繁體

屏幕截图- screen1.gif

介绍

大型结果集服务器端分页是web开发人员常见的( 重要的是) 任务。 将它与数据控件结合使用,需要提供某种形式的分页 UI。 简单的前进和后退按钮有时足够,但是在需要大量页面的地方,它们并没有真正提供令人信服的界面。 无论你使用 PagedDataSource 类还是创建一些自定义方法,在这个场景中设置其他分页形式都很耗时。 我经常发现,某个特定站点的设计约束需要重写我的分页类。

CodeProject上还有几个其他分页控件,可以在这里查看这里的。 我写的分页控件不同于( 主要),因为它是模板化的,以便容易实现任何分页 UI。 如果你希望使用任何类型的按钮,它会响应 ItemCommand 事件,或者使用 QueryString 链接同样运行(。更多SEO意识)。

附加的zip包含已经编译的DLL。完整的控制源以及一些在on上实现的示例实现。

背景

这是我开发的第一个模板化控件。 我发现有很多"发现"在试图这样做。 我不会在这里讨论所有细节,但以下资源被证明是有用的:

  • 我使用这个( 不断地),在这个例子中,对 Repeater 控件进行深入的研究。
  • Scott Mitchell在MSDN上发表了几个好文章: 模板化控制数据绑定模板。
  • 关于CodeProject的一篇优秀文章,关于编写自定义控件的一些挫折和解决方案,。

根据使用的数据库类型,服务器端分页中有很多资源可用。 它在Oracle和 SQL Server 2005中非常简单。 本文提供了对 2000可用的方法的很好的研究。

使用 TemplatedPager

试用该控件的最简单方法是右击VS2005工具箱,选择Choose项,浏览解压的文件位置,然后选择 TemplatedPager.dll。 然后,将控件的实例从你的工具箱拖到你的。

模板

有 8个模板可用。 所有模板都可以访问容器页号属性。

<%#Container.PageNumber%>

页计数属性。

<%#Container.PageCount%>

如果separator模板中的注释,这些属性将不会返回任何内容,因为这里模板没有数据绑定。

HeaderTemplate 将始终通过 Container.PageNumber 返回当前页面。

<HeaderTemplate> Page <%#Container.PageNumber%> of <%#Container.PageCount%>: </HeaderTemplate>

FirstPageTemplateLastPageTemplate 允许你指定任何"转到第一个/最后一页"元素的外观和行为。 在 FirstPage的情况下,这里模板中的Container.PageNumber 始终为 1,而在 LastPage 中的最后一个页码为。 这里模板为 included ShowFirst/ShowLast control控件属性的/为,这里信息将通过标准的PageTemplate rendered。

iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 PreviousPageTemplate 而且 NextPageTemplate 很明显。 不同于第一个和最后一个页面模板,如果控件中不存在相应的模板,它们不会通过 PageTemplate 呈现。 注意,对于这些模板,ShowNextShowPrevious 属性应该设置为 true。

iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 CurrentPageTemplate 允许当前选定的页面与它的他页面的样式不同,这将使用 PageTemplate

<CurrentPageTemplate>
 <strong><%#Container.PageNumber%></strong></CurrentPageTemplate><PageTemplate>
 <asp:LinkButton ID="lP" CommandName="Page" 
 CommandArgument="<%#Container.PageNumber%>" 
 runat="server"><%#Container.PageNumber%></asp:LinkButton></PageTemplate>

最后,SeparatorTemplate 允许你指定应该在每个页面编号之间呈现的HTML。 注意,它只在 CurrentPageTemplatePageTemplate 实例之间应用。

属性

可以在设计时和/或者运行时设置这些设置:

  • MaxPageNumbers 要显示多少页号。
  • PageCount 你可以设置这里属性,也可以设置 PagedItemCount 属性。 如果设置这里属性,则无论 PagedItemCount的值是什么,它都将被使用,而不是 PagedItemCount
  • PagedItemCount 要为你计算页计数,请将这里属性设置为要分页的项总数。 此外,请确保设置 PageSize 属性以获得准确的页计数。 计算是 CType ( 数学。天花板( pageditemcount/pagesize ) ),整数)
  • PageNumber 当前页码。 不能小于 1.
  • PageSize 每页的项目数。
  • ShowFirstShowLastShowPreviousShowNext 布尔值,指示是否绑定关联的模板。

事件

ItemCommand 事件允许你在模板中放置按钮控件并响应所引发的事件。 例如:

ProtectedSub TemplatedPager1_ItemCommand(ByVal sender AsObject, _
 ByVal e As Bxi.Web.UI.WebControls.PagerItemCommandEventArgs) _
 Handles TemplatedPager1.ItemCommand
 If e.CommandName = "Page"Then TemplatedPager1.PageNumber = e.CommandArgument
 EndIfEndSub

注意:不需要在这里控件上调用" DataBind"。 这在控件中由 requiresBind 标志处理,只要更改控件属性,就会设置该标志。

Points of Interest

当你开发( 模板化) 控件时,有许多"路面颠簸"。 以下是我所发现的一些解决方案和解决方案:

  • 我最初是从 WebControl 继承的。 它有很多不必要的继承属性,所以我从 Control 修改了 inherit。 现在,当我尝试在控件中添加模板时,我看到了服务器控件的完整列表,而不仅仅是模板。 通过添加属性来解决这个问题 ParseChildren ( true )PersistChildren ( false ) 有一个关于为什么需要这样做的信息博客,heree
  • Control 继承也导致不再能够访问容器属性( 比如,Container.PageNumber )。 大量反复尝试导致发现在将模板类添加到集合后需要调用模板类( 在我的例子中,PagerItem ),这在从 WebControl 继承时很有趣。
  • 这很傻,但我喜欢使用一个与控件相关联的icon,使用 ToolboxBitmap 属性( 为了节省你几分钟时间,它在 System.Drawing 里)。 这实际上花费了比编写大部分控制逻辑更长的时间。 Bob在这里有一篇不错的文章,这绝对没有奏效,但是让我指出了正确的答案。 在Reflector中打开你的,在资源中打开。dll 查找资源,查找你的。bmp图像( 你应该将生成操作设置为嵌入资源)。 如果它没有包含 root 命名空间( 如果有的话)。命名空间和它可能驻留在其中的任何子目录,请在 vs 中重命名 。bmp文件,以将所有这些文件都包含在其中。 在我的例子中,我将文件 NAME 更改为 Bxi.Web.UI.WebControls.Resources.TemplatedPager.bmp,并且。
  • 请注意你的root 命名空间。 我不喜欢使用一个,在类中显式地键入完整的名称空间。 很容易忘记它,然后关联控件设计器或者程序集 TagPrefix的问题,例如。

改进

我希望听到任何反馈和建议的改进,特别是如果你有模板控制开发的advice/comments/suggestions。

历史记录

  • 版本 1: 2007年08月28日。

控制  TEMP  template  Pager  
相关文章