使用 C# 为 Repeater 和 DataList 启用分页






4.89/5 (16投票s)
一个 Web 用户控件,用于在 Repeater 和 DataList 控件中启用分页功能。
引言
Repeater
和 DataList
是两个非常重要的控件,许多开发者在他们的大部分网站或 Web 应用程序中都会至少使用其中一个。此外,这些控件对于 UI 开发者来说很容易使用,但它们的功能有限。Gridview 控件有一个非常有用的分页功能,但它是一个复杂的控件,您可能不想使用它。而且,如果您想使用 Repeater
或 DataList
,它们不支持分页,那么您该怎么办呢?!!
我将向您展示如何创建一个允许分页的 Repeater
或 DataList
。我还将创建一个 Web 用户控件,任何人都可以使用该控件在 Repeater
或 DataList
控件中启用分页。
如何决定使用 DataGrid、DataList 或 Repeater
下面的 URL 描述了 DataGrid
、DataList
和 Repeater
之间的区别,并有助于决定使用哪一个:http://msdn.microsoft.com/en-us/library/aa479015.aspx。
AllowPaging 控件的优点
它可以在 Repeater
和 DataList
控件中启用分页。 这是一个易于使用的 Web 用户控件。 该控件依赖于 ObjectDataSource
,因此,如果您想使用 SqlDataSource
,只需将 ObjectDataSource
替换为 SqlDataSource
。
使用代码
示例代码分为三个部分
- 用于添加
Repeater
或DataList
控件的默认页面。 - 负责分页的
UCPager
Web 用户控件。 - 用于从数据库获取数据的
GetData
类。
此外,我在此示例中使用了 Northwind 数据库。
首先,我将谈论用户控件示例代码。 有四个重要的属性
CurrentPage
- 设置或获取当前页码Ods
- 将ObjectDataSource
传递给它ObjectControl
- 传递一个Repeater
或DataList
PageSize
- 传递一个整数,表示每页将显示多少条记录
/// <summary>
/// set or get the Current Page Number
/// </summary>
public int CurrentPage
{
get
{
//get current page number
object obj = this.ViewState["_CurrentPage"];
if (obj == null)
{
return 0;
}
else
{
return (int)obj;
}
}
set
{
//set in viewstate the current page number
this.ViewState["_CurrentPage"] = value;
}
}
/// <summary>
/// set or get ObjectDataSource that's use to bind the control
/// Like(Repeater or Datalist)
/// </summary>
public ObjectDataSource Ods { get; set; }
/// <summary>
/// set or get Control Name EX. (Repeater1 or Datalist1)
/// </summary>
public object ObjectControl { get; set; }
/// <summary>
/// set or get count of pages
/// page size determine how many records will appears in every page
/// </summary>
public int PageSize { get; set; }
下面的方法负责绑定一个控件,并根据记录的显示方式启用或禁用导航按钮。
/// <summary>
/// bind controls with data
/// enable and disable controls depending on page number
/// check for object Control if it a Repeater or a DataList
/// </summary>
/// <returns>the count of pages</returns>
private int GetItems()
{
//create new instance of PagedDataSource
PagedDataSource objPds = new PagedDataSource();
//set number of pages will appear
objPds.PageSize = PageSize;
objPds.DataSource = Ods.Select();
objPds.AllowPaging = true;
int count = objPds.PageCount;
objPds.CurrentPageIndex = CurrentPage;
if (objPds.Count > 0)
{
//dispaly controls if there are pages
btnPrevious.Visible = true;
btnNext.Visible = true;
btnLastRecord.Visible = true;
btnFirstRecord.Visible = true;
lblCurrentPage.Visible = true;
lblCurrentPage.Text = "Page " +
Convert.ToString(CurrentPage + 1) + " of " +
Convert.ToString(objPds.PageCount);
}
else
{
//disable controls if there are no pages
btnPrevious.Visible = false;
btnNext.Visible = false;
btnLastRecord.Visible = false;
btnFirstRecord.Visible = false;
lblCurrentPage.Visible = false;
}
btnPrevious.Enabled = !objPds.IsFirstPage;
btnNext.Enabled = !objPds.IsLastPage;
btnLastRecord.Enabled = !objPds.IsLastPage;
btnFirstRecord.Enabled = !objPds.IsFirstPage;
//check for object control if it a DataList
//we will use DList Variable
if (ObjectControl is DataList)
{
DList = (DataList)ObjectControl;
DList.DataSource = objPds;
DList.DataBind();
}
//check for object control if it a Repeater
//we will use Rep Variable
else if (ObjectControl is Repeater)
{
Rep = (Repeater)ObjectControl;
Rep.DataSource = objPds;
Rep.DataBind();
}
return count;
}
在第一个记录按钮中
//go to first Page
CurrentPage = 0;
GetItems();
在最后一个记录按钮中
//go to last page
CurrentPage = GetItems() -1;
GetItems();
在上一个记录按钮中
//back to previous page
CurrentPage -= 1;
GetItems();
在下一个记录按钮中
//go to next page
CurrentPage += 1;
GetItems();
在默认页面中,您所需要做的就是绑定 AllowPaging
控件属性,下面的代码解释了这一点
UCPager1.Ods = ObjEmployees;
UCPager1.ObjectControl = Repeater1;
UCPager1.PageSize = 1;
我正在等待您的评论。您可以在这里阅读我的博客:http://waleedelkot.blogspot.com/。
关注点
此控件为我节省了大量时间,我希望它也能帮助您。
历史
- 2009-08-27:发布第一个版本。