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






4.84/5 (26投票s)
带自定义分页的 GridView 控件。
引言
GridView
是一个非常强大的控件,具有包括分页/排序等所有功能。 但是,在您的项目中使用 GridView
时,您必须以编程方式为 GridView
的 PageSize
属性赋值,用户随后无法更改。 有时,用户需要更改页面大小的功能,以便他们可以每页查看更多/更少的记录。 在我的一个项目中,我被要求开发这样一个具有自定义分页的控件。 我正在与您分享这个,这样您就不必重新开发这样的控件了。
使用代码
完整的代码和程序集已附于本文。 您可以下载 MrllControlLib.dll 并在您的项目中添加对其的引用。 一旦您将该控件添加到您的页面中,您可以分配各种属性以控制在上下文菜单中设置的属性。 以下是公开的一些属性
ShowMrllCustomPaging boolean
CustomPagerCssClass
DefaultSortExpression
请注意,如果您已分配 ShowMrllCustomPaging=true
,则控件将加载所有用于分页、排序(如果已分配 SortExpression
)和页码下拉框的下拉框,否则它将作为普通的 GridView
工作。 此外,请务必处理所有事件,例如 PageIndexChanging
和 OnSorting
。 我添加了另一个事件 OnPageSizeChanged
,当页面大小下拉框更改时会触发该事件。 此事件使用 PageSizeChangeEventArgs
委托并发出一个新的页面大小值。 以下是 PageSizeChange
事件的实现
protected void gv1_PageSizeChange(object sender, PageSizeChangeEventArgs e)
{
gv1.PageSize= e.NewPageSize;
gv1.PageIndex = 0;
BindGrid();
}
其余事件如 OnSorting
/PageIndexChanging
与 GridView
相同。
关于代码
自定义 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);