65.9K
CodeProject 正在变化。 阅读更多。
Home

玩转 GridView 分页栏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (9投票s)

2007年6月20日

CPOL

4分钟阅读

viewsIcon

61790

downloadIcon

685

扩展 GridView.PagerBar 并保留其功能,并添加一个下拉菜单来更改页面大小

Screenshot - gridViewPager.gif

引言

如果您需要表格分页功能,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 中,该名称包含页面和控件名称。因此,页面和站点可以有多个网格,其页面长度可以控制,并且所有这些网格都可以独立工作。

使用代码

  1. GridViewPageSize 类添加到您的项目中。一个合适的放置位置是 App_Code 文件夹。
  2. Bsp.Software 命名空间导入到包含 GridView 的页面的代码隐藏文件中。
    Imports Bsp.Software
    
  3. (可选) 如果可用,请从 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
  4. 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
© . All rights reserved.