Home > ASP.NET With C#, Lập Trình > Asp.net DataList Paging Phân trang dữ liệu với DataList

Asp.net DataList Paging Phân trang dữ liệu với DataList

Bài viết này minh họa cho bạn cách phân trang dữ liệu với DataList với các tùy chọn tự định nghĩa bao gồm trang đầu, trang tiếp, trang trước, trang cuối và danh sách các trang như demo

Asp.net, DataList, DataList Paging, Phân trang, dữ liệu,

Cũng có khá nhiều bạn muốn có demo về phân trang với DataList. Hôm nay tìm thấy ví dụ mẫu trên trang c-sharpcorner.com. Post lên đây chia sẻ với những bạn nào còn gặp vấn đề phân trang với DataList

Trong code aspx cần có hai DataList

1. dListItems là DataList hiển thị dữ liệu chúng ta cần phân trang
2. dlPaging dùng đề hiển thị danh sách các trang được hiển thị khi chọn một trang nào đó

Bốn LinkButton để hiển thị các liên kết Trang đầu, Trang sau, Trang trước, trang cuối

Một Lable để hiển thị trang hiện tại trên tổng số trang.

Phần code aspx này tôi sẽ không nêu ở đây. Bạn cần có thể download ở liên kết cuối bài viết.

Code C# chúng ta cần có 3 thuộc tính

– CurrentPage – Trang hiện hành – fistIndex và lastIndex được dùng để phân trang DataList

#region Private Properties
private int CurrentPage
{
    get
    {
        object objPage = ViewState["_CurrentPage"];
        int _CurrentPage = 0;
        if (objPage == null)
        {
            _CurrentPage = 0;
        }
        else
        {
            _CurrentPage = (int)objPage;
        }
        return _CurrentPage;
    }
    set { ViewState["_CurrentPage"] = value; }
}
private int fistIndex
{
    get
    {

        int _FirstIndex = 0;
        if (ViewState["_FirstIndex"] == null)
        {
            _FirstIndex = 0;
        }
        else
        {
            _FirstIndex = Convert.ToInt32(ViewState["_FirstIndex"]);
        }
        return _FirstIndex;
    }
    set { ViewState["_FirstIndex"] = value; }
}
private int lastIndex
{
    get
    {

        int _LastIndex = 0;
        if (ViewState["_LastIndex"] == null)
        {
            _LastIndex = 0;
        }
        else
        {
            _LastIndex = Convert.ToInt32(ViewState["_LastIndex"]);
        }
        return _LastIndex;
    }
    set { ViewState["_LastIndex"] = value; }
}
#endregion

Chúng ta cũng cần một PagedDataSource để thiết lập các tùy biến phân trang

PagedDataSource _PageDataSource = new PagedDataSource();

Hàm GetDataTable() là hàm trả về dữ liệu là một DataTable, dữ liệu này sẽ là dữ liệu bạn lấy từ cơ sở dữ liệu qua các truy vấn. Bạn có thể tham khảo các bài viết khác nếu chưa biết cách truy vấn dữ liểu đổ vào một DataTable. Ở ví dụ này tôi tạo ra một DataTable và đổ dữ liệu vào với 100 bản ghi.

private DataTable GetDataTable()
{
    DataTable dtItems = new DataTable();

    DataColumn dcName = new DataColumn();
    dcName.ColumnName = "title";
    dcName.DataType = System.Type.GetType("System.String");
    dtItems.Columns.Add(dcName);

    DataRow row;
    for (int i = 1; i <= 155; i++)
    {
        row = dtItems.NewRow();
        row["title"] = "hmweb - Phân Trang DataList: &nbsp;Đây là bản ghi thứ " + i;
        dtItems.Rows.Add(row);
    }
    return dtItems;
}

Hàm BindItemsList ()  sử dụng hàm GetDataTable để đổ dữ liệu vào DataList. Và hiển thị số trang hiện hành.

/// <summary>
/// Binding Main Items List
/// </summary>
private void BindItemsList()
{

    DataTable dataTable = this.GetDataTable();
    _PageDataSource.DataSource = dataTable.DefaultView;
    _PageDataSource.AllowPaging = true;
    _PageDataSource.PageSize = 10;
    _PageDataSource.CurrentPageIndex = CurrentPage;
    ViewState["TotalPages"] = _PageDataSource.PageCount;

    this.lblPageInfo.Text = "Trang " + (CurrentPage + 1) + " của " + _PageDataSource.PageCount;
    this.lbtnPrevious.Enabled = !_PageDataSource.IsFirstPage;
    this.lbtnNext.Enabled = !_PageDataSource.IsLastPage;
    this.lbtnFirst.Enabled = !_PageDataSource.IsFirstPage;
    this.lbtnLast.Enabled = !_PageDataSource.IsLastPage;

    this.dListItems.DataSource = _PageDataSource;
    this.dListItems.DataBind();
    this.doPaging();
}

Với hàm này bạn có thể tùy biến giá trị PageSize (10) đưa vào biết của bàm (BindItemsList(int intPageSize)) để khi dử dụng bạn có tính tùy biến cao hơn. Trong hàm này có gọi hàm doPaging – đây là hàm thực hiện các vấn đề phân trang

/// <summary>
/// Binding Paging List
/// </summary>
private void doPaging()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("PageIndex");
    dt.Columns.Add("PageText");
    fistIndex = CurrentPage - 5;
    if (CurrentPage > 5)
    {
        lastIndex = CurrentPage + 5;
    }
    else
    {
        lastIndex = 10;
    }
    if (lastIndex > Convert.ToInt32(ViewState["TotalPages"]))
    {
        lastIndex = Convert.ToInt32(ViewState["TotalPages"]);
        fistIndex = lastIndex - 10;
    }
    if (fistIndex < 0)
    {
        fistIndex = 0;
    }
    for (int i = fistIndex; i < lastIndex; i++)
    {
        DataRow dr = dt.NewRow();
        dr[0] = i;
        dr[1] = i + 1;
        dt.Rows.Add(dr);
    }
    this.dlPaging.DataSource = dt;
    this.dlPaging.DataBind();
}

Trong hàm Page_Load chúng ta sẽ gọi hàm BindItemsList để hiển thị dữ liệu:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        this.BindItemsList();
    }
}

Chúng ta cũng cần viết code cho các sự kiện của các LinkButton tương ứng (Trang đầu, Trang trước, Trang sau, Trang cuối) như sau:

protected void lbtnNext_Click(object sender, EventArgs e)
{
    CurrentPage += 1;
    this.BindItemsList();
}
protected void lbtnPrevious_Click(object sender, EventArgs e)
{
    CurrentPage -= 1;
    this.BindItemsList();
}
protected void lbtnLast_Click(object sender, EventArgs e)
{
    CurrentPage = (Convert.ToInt32(ViewState["TotalPages"]) - 1);
    this.BindItemsList();
}
protected void lbtnFirst_Click(object sender, EventArgs e)
{

    CurrentPage = 0;
    this.BindItemsList();
}

Hai sự kiện ItemCommand và ItemDataBound để hiển thị các giá trị CurrentPage và thiết lập các thuộc tính Style cho phân trang

protected void dlPaging_ItemCommand(object source, DataListCommandEventArgs e)
{
    if (e.CommandName.Equals("Paging"))
    {
        CurrentPage = Convert.ToInt16(e.CommandArgument.ToString());
        this.BindItemsList();
    }
}
protected void dlPaging_ItemDataBound(object sender, DataListItemEventArgs e)
{
    LinkButton lnkbtnPage = (LinkButton)e.Item.FindControl("lnkbtnPaging");
    if (lnkbtnPage.CommandArgument.ToString() == CurrentPage.ToString())
    {
        lnkbtnPage.Enabled = false;
        lnkbtnPage.Style.Add("fone-size", "14px");
        lnkbtnPage.Font.Bold = true;

    }
}

Link download demo

(http://hmweb.com.vn

 

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: