使用 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控件的默认页面。
- 负责分页的 UCPagerWeb 用户控件。
- 用于从数据库获取数据的 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:发布第一个版本。


