شماره بندی صفحات با استفاده از Repeater و Stored Procedure در asp.net
یکشنبه 5 بهمن 1393در این مقاله به پیاده سازی paging در asp.net خواهیم پرداخت لازم به ذکر است که این عمل با استفاده از کنترلر Repeater انجام خواهد شد .
کنترلر 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); }
- ASP.net
- 4k بازدید
- 13 تشکر