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

带 pageSize 更改下拉列表的 GridView 自定义分页

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (26投票s)

2008年5月5日

CPOL

2分钟阅读

viewsIcon

234951

downloadIcon

11578

带自定义分页的 GridView 控件。

GridView Custom paging with PageSize change dropdown

引言

GridView 是一个非常强大的控件,具有包括分页/排序等所有功能。 但是,在您的项目中使用 GridView 时,您必须以编程方式为 GridViewPageSize 属性赋值,用户随后无法更改。 有时,用户需要更改页面大小的功能,以便他们可以每页查看更多/更少的记录。 在我的一个项目中,我被要求开发这样一个具有自定义分页的控件。 我正在与您分享这个,这样您就不必重新开发这样的控件了。

使用代码

完整的代码和程序集已附于本文。 您可以下载 MrllControlLib.dll 并在您的项目中添加对其的引用。 一旦您将该控件添加到您的页面中,您可以分配各种属性以控制在上下文菜单中设置的属性。 以下是公开的一些属性

  • ShowMrllCustomPaging boolean
  • CustomPagerCssClass
  • DefaultSortExpression

请注意,如果您已分配 ShowMrllCustomPaging=true,则控件将加载所有用于分页、排序(如果已分配 SortExpression)和页码下拉框的下拉框,否则它将作为普通的 GridView 工作。 此外,请务必处理所有事件,例如 PageIndexChangingOnSorting。 我添加了另一个事件 OnPageSizeChanged,当页面大小下拉框更改时会触发该事件。 此事件使用 PageSizeChangeEventArgs 委托并发出一个新的页面大小值。 以下是 PageSizeChange 事件的实现

protected void gv1_PageSizeChange(object sender, PageSizeChangeEventArgs e) 
{ 
    gv1.PageSize= e.NewPageSize; 
    gv1.PageIndex = 0; 
    BindGrid(); 
}

其余事件如 OnSorting/PageIndexChangingGridView 相同。

关于代码

自定义 gridview 控件继承自 .NET GridView 控件,并且 OnRowCreated 方法被重写,以更改分页样式。 当有多于一页时,将加载默认的 pager 模板。 我清除 pager 模板中的所有控件,并添加我的用于分页/排序/记录数下拉框的控件。

protectedd override OnRowCreated(GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.Pager) 
    { 
          e.Row.Cells[0].Controls.Clear(); 
          //Code to Add various Dropdown 
          //Add control to Row 
          // oOutertab is table containg all dropdown and Lable 
          
          e.Row.Cells[0].Controls.Add(oOutertab); 
    }
}

现在,问题是当只有一页时,PagerTemplate 将不会被创建,那么我如何放置自定义分页和排序下拉框呢? 答案是在位置零(刚好在标题行上方)向 GridView 添加一行。 我在创建标题时通过添加一行来实现这一点。

protected override void OnRowCreated(GridViewRowEventArgs e)
{ 
    if (e.Row.RowType == DataControlRowType.Header) 
    { 
        if (PageCount ==1) 
        { 
            GridViewRow PagerRow = base.CreateRow(-1, -1, 
               DataControlRowType.Pager, DataControlRowState.Normal); 
            //Add Your container of controls in this New row 
            PagerRow.Cells.Add(new TableCell()); 
            PagerRow.Cells[0].Controls.Add(oTab);  
            PagerRow.Cells[0].ColumnSpan = this.Columns.Count; 
 
            //Add the New row at Position 0 of GrdView 
            Table grid = (Table)this.Controls[0]; 
                                grid.Rows.AddAt(0, PagerRow); 
        } 
    } 
}

现在,还有另一个问题。 一旦您在位置零添加一行,它将具有标题模板的样式,因为我们在创建标题行时添加了这一行。 因此,为了在正确的行上应用正确的样式,我们需要将 CustomPagerCssClass 分配给 pager 模板,并将 HeaderStyleCssClass 分配给 Header 模板(现在位于位置 1),或者我们可以在 RowCreated 事件中分配 CSS,然后再在位置零添加新行。

GridViewRow PagerRow = base.CreateRow(-1, -1, 
    DataControlRowType.Pager, DataControlRowState.Normal); 
if (this.CustomPagerCssClass != string.Empty) 
      PagerRow.CssClass = this.CustomPagerCssClass; 
 
if (this.HeaderStyle.CssClass != string.Empty) 
      e.Row.CssClass = this.HeaderStyle.CssClass; 
//Now Add Pager Row at Position zero 
Table grid = (Table)this.Controls[0]; 
grid.Rows.AddAt(0, PagerRow);
© . All rights reserved.