صفحه بندی سفارشی Gridview توسط ObjectDataSource و StoredProcedure Gridview Custom Paging Using Object Data Source And Stored procedure فایل پروژه را از اینجا دانلود نمایید در این مقاله به یکی از روش های ساده در عین حال بسیار کاربردی صفحه بندی می پردازیم ، این روش باعث می شود که کارایی سایت چندین برابر گردد .
بسیاری از برنامه نویسان و توسعه گران وب بدون دقت به این مسئله که کنترل های دارای صفحه بندی مانند Gridview به صورت پیش فرض برای صفحه بندی کل اطلاعات را از بانک درخواست کرده و سپس صفحه بندی را انجام می هند از این کنترل ها برای این کار استفاده می کنند .
ولی هنگامی که تعداد رکورد های درخواستی زیاد می شود ، با مشکلات شدیدی نظیر کاهش سرعت ، افزایش ترافیک بی رویه سایت ، Stop شدن IIs و... روبرو خواهند شد .
فرض کنید یک جدول در بانک اطلاعاتی SQL Server 2005 دارید که شامل تعداد زیادی رکورد هست ، و میخواهید با شرط خاصی این رکورد ها را دریافت و پس از صفحه بندی داخل یک Gridview نمایش دهید .
ابتدا نیاز به یک Sp جهت واکشی اطلاعات از بانک اطلاعاتی داریم ، قبلا برای اینکار یک Sp ساده به صورت زیر می نوشتیم که تمامی رکوردهای مربوط را دریافت و سپس صفحه بندی انجام می شد :
|
Create PROCEDURE [dbo].[GetMessagesByUserID]
(
@UserID int
)
AS
SELECT MsgID,MsgTitle,MsgType,MsgBody
FROM TblMessages
WHERE (UserID = @UserID)
|
همانطور که توضیح دادم در این Sp تمامی رکورد های TBLMessage با شرط User خاص درخواست داده می شود ، اگر تعداد این رکورد ها 2 میلیون باشد چه اتفاقی خواهد افتاد ؟
بدین منظور ما از روش زیر استفاده کرده و یک Sp جالب به صورت زیر می سازیم ، در حقیقت تمام کارها بر دوش این Sp است پس به نحوه تعریف پارامتر ها و ساخت این Sp بسیار توجه نمایید :
|
Create PROCEDURE [dbo].[GetMessagesByUserID]
(
@UserID int ,
@startRowIndex int,
@maximumRows int
)
AS
SELECT MsgID,MsgTitle,MsgType,MsgBody
FROM
(
SELECT MsgID,MsgTitle,MsgType,MsgBody,
ROW_NUMBER() OVER(ORDER BY MsgID desc) as RowNum
FROM TblMessages
WHERE (UserID = @UserID)
) as Messages
WHERE RowNum BETWEEN @startRowIndex+1 AND (@startRowIndex + @maximumRows)
|
به تفاوت میان دو Sp فوق دقت کنید ، ما از متد جالب Row_Number که در ورژن 2005 نرم افزار SQL Server اضافه شده استفاده کردیم و به صورت فوق اطلاعات مورد نیاز را واکشی نمودیم .
خوب ما به یک Sp دیگر جهت برآورد تعداد کل رکورد های بانک بر اساس شرط یاد شده نیز نیاز داریم که بسیار ساده می باشد :
|
ALTER PROCEDURE [dbo].[GetMessagesCountByUserID]
(
@UserID int
)
AS
SELECT Count(*)
FROM TblMessages
WHERE (UserID = @UserID)
|
حال به سراغ پروژه می رویم .
یک Dataset به پروژه اضافه کنید (منظور Typed Dataset هست که از طریق منوی Add New Item اضافه می گردد) و نام آن را MessageDA بگذارید (لایه Data Access) ، یک Table Adapter به آن اضافه کرده و آن را به Sp اول (
GetMessagesByUserID) مرتبط کنید .
پس از ایجاد این Table Adapter ، بر روی آن کلیک راست کرده و از طریق گزینه Add Query متد GetMessageCountByUserID را نیز به Data Table اضافه نمایید .
همچنین یک Table Adapter جهت واکشی اطلاعات جدول User قرار داده و یک Sp ساده نیز برای آن بنویسید .
اکنون یک کلاس به نام MessageBL (لایه Business Logic) به پروژه اضافه کرده و متد های واکشی را در آن می نویسیم ، دقت کنید که این کلاس حتما باید از نوع DataObject باشد (بک کد زیر توجه کنید) :
|
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using MessageDATableAdapters;
[System.ComponentModel.DataObject]
public class MessageBL
{
public MessageDA.GetMessagesByUserIDDataTable GetMessagesByUserID(int UserID, int startRowIndex, int maximumRows)
{
using (GetMessagesByUserIDTableAdapter Db = new GetMessagesByUserIDTableAdapter())
{
return Db.GetData(UserID, startRowIndex, maximumRows);
}
}
public int GetMessageCountByUserID(int UserID, int startRowIndex, int maximumRows)
{
using (GetMessagesByUserIDTableAdapter Db = new GetMessagesByUserIDTableAdapter())
{
return Convert.ToInt32(Db.GetMessagesCountByUserID(UserID));
}
}
public MessageDA.GetUsersDataTable GetUsers()
{
using (GetUsersTableAdapter Db = new GetUsersTableAdapter())
{
return Db.GetData();
}
}
}
|
در کلاس فوق سه متد مورد نیاز ما ایجاد شده است .
حال یک صفحه aspx ایجاد کرده و یک Gridview در آن قرار داده و آن را توسط ObjectDatasource به کلاس MessageBl و متد GetMessageByUserID بایند کنید .
ابتدا خاصیت Paging کنترل Gridview را طبق معمول فعال کنید .
حال به سراغ Object DataSource بروید ، این شی دارای تنظیماتی برای Paging می باشد ، ابتدا خاصیت EnablePaging را True کنید ، مقادیر maximumRows و startRowIndex به نام پارامترهای Sp اشاره می کند که به همین صورت صحیح می باشد .
خاصیت Select Count Method را برابر Sp که برای دریافت تعداد کل رکوردها ساختیم قرار دهید : GetMessageCountByUserID
کار تمام است .
شما می توانستید تمامی این مراحل آخر را توسط کد نویسی محض و بدون استفاده از دیتاست نیز انجام دهید . کافیست برای این کار در کلاس MessageBl به جای استفاده از Dataset از Ado.NET استفاده کنید .
فایل پروژه را از اینجا دانلود نمایید