شماره بندی صفحات با استفاده از Repeater و Stored Procedure در asp.net

در این مقاله به پیاده سازی paging در asp.net خواهیم پرداخت لازم به ذکر است که این عمل با استفاده از کنترلر Repeater انجام خواهد شد .

شماره بندی صفحات با استفاده از Repeater و Stored Procedure در asp.net

کنترلر Repeater به صورت پیش فرض دارا ی پیج بندی نیست برای همین منظور از Stored Procedure استفاده خواهیم کرد که در این sp فقط رکورد های یک صفحه را از پایگاه داده واکشی میکنیم بنابراین اگر جدول ما دارای 100 رکورد باشد وبخواهیم در هر صفحه 50 رکورد نشان دهیم پس  sp برای ما 50 رکورد را واکشی میکند برای مثال از پایگاه داده آموزشی Northwind استفاده میکنیم.

در sp خود از Row_Number استفاده کرده ایم که به ما اجازه میدهد که برای رکورد هایی از جدول که انتخاب میکنیم شماره ردیف در نظر بگیریم.با استفاده از این شماره ردیف ما می توانیم منطق صفحه بندی سفارشی را پیاده سازی کنیم.

از جدول Customers استفاده کرده و  sp خود را به شکل زیر مینویسیم:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
CREATE PROCEDURE GetCustomersPageWise
      @PageIndex INT = 1
      ,@PageSize INT = 10
      ,@RecordCount INT OUTPUT
AS
BEGIN
      SET NOCOUNT ON;
      SELECT ROW_NUMBER() OVER
      (
            ORDER BY [CustomerID] ASC
      )AS RowNumber
      ,[CustomerID]
      ,[CompanyName]
      ,[ContactName]
     INTO #Results
      FROM [Customers]
     
      SELECT @RecordCount = COUNT(*)
      FROM #Results
           
      SELECT * FROM #Results
      WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
     
      DROP TABLE #Results
END
GO

زمانی که میخواهیم رکورد ها را از پایگاه داده واکشی کنیم باید دو مقدار برای PageIndex, PageSize پارامتر های ورودی sp تعیین کنیم همچنین به تعداد کل رکورد های جدول نیز نیاز داریم که در پارامتر RecordCount قرار داده شده است.

یک کنترلر Repeater برای رکورد های Customer به صفحه خود اضافه کنید:

<table class="Repeater" cellspacing="0" rules="all" border="1">
    <tr>
        <th scope="col" style="width: 80px">
            Customer Id
        </th>
        <th scope="col" style="width: 150px">
            Customer Name
        </th>
        <th scope="col" style="width: 150px">
            Company Name
        </th>
    </tr>
    <asp:Repeater ID="rptCustomers" runat="server">
        <ItemTemplate>
            <tr>
                <td>
                    <asp:Label ID="lblCustomerId" runat="server" Text='<%# Eval("CustomerId") %>' />
                </td>
                <td>
                    <asp:Label ID="lblContactName" runat="server" Text='<%# Eval("ContactName") %>' />
                </td>
                <td>
                    <asp:Label ID="lblCompanyName" runat="server" Text='<%# Eval("CompanyName") %>' />
                </td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>
</table>

و یک  Repeater برای صفحه بندی اضافه میکنیم :

<asp:Repeater ID="rptPager" runat="server">
    <ItemTemplate>
        <asp:LinkButton ID="lnkPage" runat="server" Text='<%#Eval("Text") %>' CommandArgument='<%# Eval("Value") %>'
            CssClass='<%# Convert.ToBoolean(Eval("Enabled")) ? "page_enabled" : "page_disabled" %>'
            OnClick="Page_Changed" OnClientClick='<%# !Convert.ToBoolean(Eval("Enabled")) ? "return false;" : "" %>'></asp:LinkButton>
   </ItemTemplate>
</asp:Repeater>

سپس در PageLoad صفحه تابع GetCustomersPageWise را فراخوانی میکنیم :

private int PageSize = 10;
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        this.GetCustomersPageWise(1);
    }
}
 
private void GetCustomersPageWise(int pageIndex)
{
    string constring = ConfigurationManager.ConnectionStrings["constring"].ConnectionString;
    using (SqlConnection con = new SqlConnection(constring))
    {
        using (SqlCommand cmd = new SqlCommand("GetCustomersPageWise", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@PageIndex", pageIndex);
            cmd.Parameters.AddWithValue("@PageSize", PageSize);
            cmd.Parameters.Add("@RecordCount", SqlDbType.Int, 4);
            cmd.Parameters["@RecordCount"].Direction = ParameterDirection.Output;
            con.Open();
            IDataReader idr = cmd.ExecuteReader();
            rptCustomers.DataSource = idr;
            rptCustomers.DataBind();
            idr.Close();
            con.Close();
            int recordCount = Convert.ToInt32(cmd.Parameters["@RecordCount"].Value);
            this.PopulatePager(recordCount, pageIndex);
        }
    }
}

در خط اخر از یک تابع به نام PopulatePager استفاده شده که تعداد کل رکورد های جدول و شماره صفحه به عنوان ورودی های آن به کار برده شده است وظیفه این تابع محاسبه تعداد صفحات است.

بدنه تابع را به شکل زیر مینویسیم:


private void PopulatePager(int recordCount, int currentPage)
{
    double dblPageCount = (double)((decimal)recordCount / Convert.ToDecimal(PageSize));
    int pageCount = (int)Math.Ceiling(dblPageCount);
    List<ListItem> pages = new List<ListItem>();
    if (pageCount > 0)
    {
        for (int i = 1; i <= pageCount; i++)
        {
            pages.Add(new ListItem(i.ToString(), i.ToString(), i != currentPage));
        }
    }
    rptPager.DataSource = pages;
    rptPager.DataBind();
}

در رویداد کلیک linkbutton کد زیر برای واکشی رکورد های جدید مینویسیم:


protected void Page_Changed(object sender, EventArgs e)
{
    int pageIndex = int.Parse((sender as LinkButton).CommandArgument);
    this.GetCustomersPageWise(pageIndex);
}

فایل های ضمیمه