玩转 GridView 分页栏
扩展 GridView.PagerBar 并保留其功能,并添加一个下拉菜单来更改页面大小
引言
如果您需要表格分页功能,GridView 的 PagerBar 对您来说已经做得相当不错了。实际上,只需单击AllowPaging
属性,即可为您的表格添加一个漂亮且功能齐全的数字分页器。再次点击分页设置 -> 模式,您的分页器外观可以改变三次。您不喜欢任何一种外观?右键单击网格,选择编辑模板 -> PagerTemplate,然后您可以自己动手了。问题是,一旦您为分页器创建模板,所有漂亮的 PagerBar 功能都消失了。不再有可点击的页码或上一页/下一页按钮;您必须在模板中手动重新创建它们。
在本文中,我们将扩展 PagerBar 并保留其功能。我们将添加一个下拉菜单,用于更改页面大小,即每页显示的行数。此示例足够简单,可以演示该方法,但它也有一定的难度。除了扩展 PagerBar 的外观之外,我们还必须启用和处理下拉菜单的AutoPostback
事件。
背景
这项工作受到了 Phillip Williams 的一篇博文的启发,可以在这里找到 这里。他建议使用 GridView 的RowCreated
事件向 PagerBar 添加一个链接控件。有关 GridView 控件中分页的非常有用的信息,可以在 Francisco Santos Jr. 撰写的文章“GridView 控件中的自定义分页”中找到。
我们是如何做到的
RowCreated
事件在 GridView 控件中创建的每一行都会触发。我们只对分页器行感兴趣,因此我们忽略所有其他行。我们仍然在类的共享方法内执行此操作,以便简化用户端的代码(并让他用一些 CPU 周期来换取便利)。
If gridRow.RowType <> DataControlRowType.Pager Then Return
在我们将页面大小选择器插入 PagerBar 之前,我们必须确保即使整个表格的行数少于当前页面大小,PagerBar 也可见。否则,用户将无法减小页面大小。我们目前正在处理RowCreated
事件。由于在控件生命周期的早期处理 PagerBar 可见性还为时过早,因此我们必须订阅网格的 PreRender 事件。
Dim enoughRows As Boolean = ( grid.Rows.Count >= MINIMAL_PAGE_SIZE )
If enoughRows Then
AddHandler grid.PreRender,
New EventHandler( AddressOf MakeSurePagerIsVisible)
End If
一旦我们获取了网格的PreRender
事件,我们就必须注意 GridView 分页器的 Position 设置。这是因为 TopPagerRow 和 BottomPagerRow 的可见性在 GridView 中是独立处理的。
Private Shared Sub MakeSurePagerIsVisible(ByVal sender As Object,
ByVal e As System.EventArgs)
Dim grid As GridView = sender
Select Case grid.PagerSettings.Position
Case PagerPosition.Bottom
grid.BottomPagerRow.Visible = True
Case PagerPosition.Top
grid.TopPagerRow.Visible = True
Case PagerPosition.TopAndBottom
grid.BottomPagerRow.Visible = True
grid.TopPagerRow.Visible = True
End Select
End Sub
最后,我们可以将页面大小选择下拉菜单添加到分页器。查看渲染后的 HTML 可以看出,分页器是一个表格结构,我们必须对其进行导航才能在行的末尾插入一个单元格。页面大小选择器的表格单元格在CreateSizer
函数中创建。一旦进入该函数,我们就会添加一个标签来描述DropDown
。我们不要忘记启用AutoPostBack
并注册TextChanged
事件。
sel.AutoPostBack = True
AddHandler sel.TextChanged,
New EventHandler( AddressOf PageSizeSelector_Clicked)
分页器表格的导航发生在GetPagerTableRow
函数中。这段代码取决于分页器的渲染方式。这很危险,因为 Microsoft 可能会更改分页器的渲染方式,然后我们的代码就会中断。此外,如果模板没有模仿生成的表格结构,它会妨碍我们的代码使用模板化分页器。唉,所有这些改进都留给您,亲爱的读者。
选定的页面大小存储在一个具有唯一名称的 Cookie 中,该名称包含页面和控件名称。因此,页面和站点可以有多个网格,其页面长度可以控制,并且所有这些网格都可以独立工作。
使用代码
- 将
GridViewPageSize
类添加到您的项目中。一个合适的放置位置是 App_Code 文件夹。 - 将
Bsp.Software
命名空间导入到包含 GridView 的页面的代码隐藏文件中。Imports Bsp.Software
- (可选) 如果可用,请从 Cookie 设置页面大小。
Protected Sub GridView_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles GridView1.Load, GridView2.Load Dim gv As Control = sender If Not gv.Page.IsPostBack Then GridViewPageSize.SetPageSize(Me, sender) End If End Sub
- 在
RowCreated
事件中将PageSize
选择器插入分页器。Protected Sub GridView_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _ Handles GridView1.RowCreated, GridView2.RowCreated GridViewPageSize.AddSizerToGridPager(sender, e.Row) End Sub
历史
- 2007 年 6 月 20 日:代码和本文档已创建并提交 CodeProject 审核。
- 2007 年 6 月 21 日:感谢Phillip Williams,代码得到了改进。原始版本没有处理 GridView 页面大小更改后立即发生页面刷新事件的情况。即使在前面回发期间创建的 Cookie 已经存在,也应该重新执行完整的
PageSizeSelector_Clicked
。