kết quả từ 1 tới 3 trên 3

Kỹ thuật phân trang trong asp.net

  1. #1
    Ðến Từ
    Thành phố Bạc Liêu
    Thành Viên Thứ: 56113
    Giới tính: Nam
    Bài gửi
    3

    Kỹ thuật phân trang trong asp.net

    hmweb- Trên website này có viết bài "Kỹ thuật phân trang bằng Store Procedure" nhưng nhiều bạn chưa áp dụng được nó để phân trang trong asp.net và có nhiều bạn hỏi cách làm. Bài này mình sẽ hướng dẫn các bạn sử dụng thuật toán của bài viết đó vào trang asp.net.

    Trong bài viết "Kỹ thuật phân trang bằng Store Procedure" thì dữ liệu hiển thị sẽ được chia làm 2 phần, một phần là dữ liệu truy vấn, một phần là chuỗi html hiển thị phân trang. Vậy để sử dụng nó bạn cần đổ dữ liệu từ Store vào DataSet. Khi đó phần dữ liệu truy vấn sẽ là Table[0] và phần hiển thị phân trang là Table[1]. Vậy bạn cần viết hàm để thực hiện nó. Để thực hiện mình lấy database Northwind, truy vấn dữ liệu từ bảng Customrs. Với Stored Procedure spPhanTrangSQL bạn xem ở bài viết "Kỹ thuật phân trang bằng Store Procedure" còn Store truy vẫn dữ liệu mình viết như sau:

    --CREATE BY hungbv.com.vn
    CREATE PROCEDURE [dbo].[spCustomers_PhanTrang]
    @currPage int,
    @recodperpage int,
    @Pagesize int
    AS
    Begin
    Begin
    WITH s AS
    (
    SELECT ROW_NUMBER()
    OVER(ORDER BY CustomerID,
    CompanyName) AS RowNum,
    CustomerID,
    CompanyName,
    ContactName, City
    FROM Customers
    )
    Select * From s
    Where RowNum Between
    (@currPage - 1)*@recodperpage+1
    AND @currPage*@recodperpage
    END
    -- Tính tổng số bản ghi
    DECLARE @Tolal int
    SELECT @Tolal=Count(*) FROM Customers

    EXEC spPhanTrangSQL
    @Tolal,
    @currPage,
    @Pagesize,
    @recodperpage
    END
    Trong trang aspx bạn cần một Gridview và một Literal để hiển thị dữ liệu như sau:

    <table cellpadding="0" cellspacing="0" width="620">
    <tr>
    <td style="width: 100%">
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BackColor="White"
    BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" CellPadding="4" Width="620px">
    <RowStyle BackColor="White" ForeColor="#330099" />
    <Columns>
    <asp:BoundField DataField="RowNum" HeaderText="RowNum" SortExpression="RowNum" />
    <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" SortExpression="CustomerID" />
    <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" SortExpression="CompanyName" />
    <asp:BoundField DataField="ContactName" HeaderText="ContactName" SortExpression="ContactName" />
    <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
    </Columns>
    <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" />
    <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" />
    <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" />
    <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" />
    </asp:GridView>
    </td>
    </tr>
    <tr>
    <td style="width: 100%">
    <asp:Literal ID="ltlPhanTrang" runat="server"/></td>
    </tr>
    </table>
    Khi chạy dữ liệu được hiển thị như hình minh họa sau:



    Giờ chúng ta sẽ viết Các hàm cần thực hiện hiển thị dữ liệu:

    1. Hàm thực thi một Store đổ dữ liệu vào DataSet

    private static DataSet ThucThiStore_DataSet(
    string StoredProcedure,
    params SqlParameter[] Parameters)
    {
    //Khai báo cuỗi kết nối
    string ConnectionString =
    @"Server =.\SQL2005;Initial Catalog=Northwind;User ID=sa;Password=sa";
    SqlConnection Conn = new SqlConnection(ConnectionString);
    SqlCommand Command = new SqlCommand(StoredProcedure, Conn);
    if (Parameters != null)
    {
    Command.Parameters.Clear();
    Command.Parameters.AddRange(Parameters);
    }
    DataSet ds = new DataSet(); SqlDataAdapter da =
    new SqlDataAdapter(StoredProcedure, Conn);
    Command.CommandType = CommandType.StoredProcedure;
    da.SelectCommand = Command;
    try
    {
    //Mở kết nối
    Conn.Open();
    da.Fill(ds);
    }
    finally
    {
    // Đóng kết nối
    if (Conn.State == ConnectionState.Open)
    Conn.Close();
    Conn.Dispose();
    }
    return ds;
    }
    2. Hàm lấy dữ liệu từ Store trả về một DataSet

    private DataSet StoreToDataSet(
    int currPage,
    int recodperpage,
    int Pagesize)
    {
    DataSet dts = new DataSet();
    SqlParameter[] arrParam = {
    new SqlParameter("@currPage", SqlDbType.Int),
    new SqlParameter("@recodperpage", SqlDbType.Int),
    new SqlParameter("@Pagesize", SqlDbType.Int)
    };
    arrParam[0].Value = currPage;
    arrParam[1].Value = recodperpage;
    arrParam[2].Value = Pagesize;
    return ThucThiStore_DataSet("spCustomers_PhanTrang", arrParam);
    }
    3. Hàm nạp dữ liệu để hiển thị

    private void NapDuLieu(int currPage, int recodperpage, int Pagesize)
    {
    DataSet ds = StoreToDataSet(currPage, recodperpage, Pagesize);
    DataTable dtbData = ds.Tables[0];
    DataTable dtbPhanTrang = ds.Tables[1];
    if (dtbData.Rows.Count > 0)
    {
    GridView1.DataSource = dtbData;
    GridView1.DataBind();
    if (dtbPhanTrang.Rows.Count > 0)
    {
    ltlPhanTrang.Text = dtbPhanTrang.Rows[0]["PhanTrang"] + "";
    }
    }
    }
    Trong hàm này bạn thấy dữ liệu được chia làm 2 phần như đã nói ở trên và Phân dữ liệu truy vấn là Table[0] được bind vào Gridview1 còn phần dữ liệu phân trang là Table[1] (Chỉ là 1 bản ghi dữ liệu dang html được gán vào ltlPhanTrang).

    Trong hàm Page_Load bạn cần khai báo 1 biến page và hiển thị dữ liệu như sau:

    protected void Page_Load(object sender, EventArgs e)
    {
    int page = int.Parse("0" + Request.QueryString["page"]);
    if (page == 0) page = 1;
    if (!IsPostBack)
    {
    NapDuLieu(page, 10, 5);
    }
    }


    Xem hàm Page_Load bạn thấy mình truyền giá trị 10 là số bản ghi hiển thị cho mỗi trang (rowperpage) và giá trị 5 là số trang hiển thị mỗi phân đoạn (@PageSize)

    Bạn có thể download mã nguồn trang asp mình viết về tham khảo tại đây. Tham khảo thêm bài viết về phân trang trong Gridview

    Chúc bạn thành công
    Quick reply to this message Trả lời       


  2. #2
    Ðến Từ
    Huyện Vĩnh Lợi
    Thành Viên Thứ: 128156
    Giới tính: Nam
    Bài gửi
    3

    Ðề: kỹ thuật phân trang trong asp.net

    Trùi làm già mà phước tạp vậy, bạn sử dụng mô hình 3 lớp MVC 3 đi truy vấn trên ngôn ngữ LINQ làm rất nhanh (Sử dụng Linq to SQL)

  3. #3
    Ðến Từ
    Tỉnh Khác
    Thành Viên Thứ: 174223
    Bài gửi
    10

    Reply: kỹ thuật phân trang trong asp.net

    Phân trang kiểu này rất phức tạp.
    Nếu có 100 table chẳng lẽ phải viết 100 PROCEDURE