PDA

View Full Version : مقاله: پایان مشکل پیجینگ در DATA LIST



saleh.hi.62
چهارشنبه 10 مهر 1387, 00:48 صبح
یکی از موضوعاتی که معمولا برنامه نویسان محیط ASP.NET با آن مواجه هستند صفحه بندی اطلاعات دریافتی از دیتابیس درون GridView است ( که براحتی قابل انجام هست) . از طرفی در بسیاری از مواقع دوست داریم اطلاعات رو در بیش از یک ستون نمایش دهیم که مجبوریم از کنترل DataList استفاده کنیم چون GridView خاصیت RepeatColumns رو نداره و دقیقا مشکل همین جاست زیرا DataList هم خاصیت paging رو نداره . بنابراین برای استفاده از هر دو خاصیت RepeatColumns و paging به مشکل بر خواهیم خورد . در این مقاله مختصر آموزشی قصد دارم راه حلی بسیار ساده و البته اصولی رو براتون شرح بدم که مشکل فوق رو براحتی حل می کنه .
در دات نت کلاسی با عنوان PagedDataSource در System.Web.UI.WebControls namespace وجود داره که قابلیت paging رو برای کنترل های دات نت فراهم می کنه . ما با استفاده از این کلاس خاصیت paging رو به کنترل DataList اضافه می کنیم . (این مطلب در مورد Repeater هم صادق هست)
ابتدا یک پروژه وب سایت ایجاد کنید و در صفحه Default.aspx کدهای HTML زیر را وارد کنید :



<table width="100%" border="0">
<tr>
<td> DataList control with Paging</td>
</tr>
<tr>
<td> <asp:label id="lblCurrentPage" runat="server"></asp:label></td>
</tr>
<tr>
<td> <asp:button id="cmdPrev" runat="server" text=" << " OnClick="cmdPrev_Click"></asp:button>
<asp:button id="cmdNext" runat="server" text=" >> " OnClick="cmdNext_Click"></asp:button></td>
</tr>
</table>
<asp:DataList ID="dlPaging" runat="server" RepeatColumns="2">
<ItemTemplate>
<asp:Image ID="img1" runat="server" ImageUrl='<%#DataBinder.Eval(Container.DataItem,"imageURL") %>' />
<asp:Label ID="Label2" runat="server" Text='<%#DataBinder.Eval(Container.DataItem,"imageName") %>'></asp:Label>
</ItemTemplate>
</asp:DataList>






حالا میریم به Code View :
در متد Page_Load کد زیر را وارد می کنیم :



if (!IsPostBack)
{
FetchDataToDataList();
}



و سپس کد مربوط به متد FetchDataToDataList :



private void FetchDataToDataList()
{
SqlConnection con = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=yourDataBase;Data Source=YourServer");
SqlCommand cmd = new SqlCommand("select imageUrl,imageName from imageTable", con);
con.Open();
PagedDataSource pagedDS = new PagedDataSource();
DataTable dt = new DataTable("_T");
dt.Load( cmd.ExecuteReader());
pagedDS.DataSource =dt.DefaultView;
pagedDS.AllowPaging = true;
pagedDS.PageSize = 5;
pagedDS.CurrentPageIndex = CurrentPage;
dlPaging.DataSource = pagedDS;
dlPaging.DataBind();
con.Close();

lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of "+ pagedDS.PageCount.ToString();
// Disable Prev or Next buttons if necessary
cmdPrev.Enabled = !pagedDS.IsFirstPage;
cmdNext.Enabled = !pagedDS.IsLastPage;
}






همونطور که در کد بالا می بینیم ابتدا connection مورد نظر رو می سازیم و توسط sqlCommand دستور select مورد نظرمون رو اجرا می کنیم . قبل از اجرای select از کلاس PagedDataSource یک نمونه با نام pagedDS ایجاد می کنیم . همچنین یک Table با نام dt ایجاد کرده و با اجرای sqlCommand آن را پر می کینم . حالا لازمه شیئ pagedDS رو توسط dt پر کنیم و تنظیمات لازم مربوط به خاصیت paging رو براش ست کنیم .در نهایت مشخص می کنیم که CurrentPageIndex مقدار صفر داشته باشه تا صفحه اول اطلاعات در ابتدا نمایش داده شوند . و در آخر شیئ pagedDS رو به خصوصیت dlPaging.DataSource انتصاب می دیم.در اینجا لازمه درباره CurrentPage توضیح بدم .
CurrentPage یک property هست که در هر لحظه شماره صفحه جاری را در this.ViewState["_CurrentPage"] نگهداری می کنه . کد این property به شرح زیره :


public int CurrentPage
{
get
{
// look for current page in ViewState
object o = this.ViewState["_CurrentPage"];
if (o == null)
return 0; // default page index of 0
else
return (int)o;
}

set
{
this.ViewState["_CurrentPage"] = value;
}
}




حالا لازمه برای دو دگمه ای که ما رو به صفحات قبل و بعد می بره کدهای زیر رو بنویسیم :


protected void cmdPrev_Click(object sender, EventArgs e)
{
// Set viewstate variable to the previous page
CurrentPage -= 1;

// Reload control
FetchDataToDataList();
}
protected void cmdNext_Click(object sender, EventArgs e)
{
// Set viewstate variable to the previous page
CurrentPage += 1;

// Reload control
FetchDataToDataList();
}


با این روش ساده به راحتی می تونیم خاصیت paging رو به کنترل مورد نظرمون اضافه کنیم .


منبع : سايت پرشين تولز

Neo Persian
چهارشنبه 10 مهر 1387, 12:40 عصر
ممنون از بابت مقاله

ولي مشكل اساسي كه اين روش داره راندمان پايين اون هستش فرض كنيد حدود 10000 ركورد در اون جدول وجود داره و قراره براي هر صفحه فقط 100 ركورد نمايش داده بشه، در اين صورت براي نمايش هر صفحه 10000 ركورد درخواست ميشه و فقط از 100 تاي اون استفاده ميشه!

روش بهينه تر اينه كه عمليات paging در سمت ديتابيش انجام بشه كه با اومدن SQL 2005 و ()ROW_NUMBER استفاده از اين روش ميسر شده

nazaninam
چهارشنبه 10 مهر 1387, 12:45 عصر
بد نبود منبع رو هم معرفی می کردی !!!!!

saleh.hi.62
چهارشنبه 10 مهر 1387, 15:31 عصر
دوست عزیز بالای فایل ضمیمه نوشتم که:خجالت:

آقای neo حرف شما کاملا درسته.ولی دیتا لیست با قابلیت پیجینگ رو همه برای ساخت گالری میخوان که شاید 50 تا رکورد بیشتر نشه.

mohsen.r
سه شنبه 21 اردیبهشت 1389, 03:21 صبح
دوست عزیز خیلی ممنون از مقاله خوبتون

khz-web1
سه شنبه 21 اردیبهشت 1389, 13:12 عصر
این مقاله مال آقای دلشاد هستش....:لبخندساده:
من فکر می کنم که شما اشتباه منبع دادید....
آقای دلشاد اگر درست می گم ، تایید کنید

farnooshhp
شنبه 03 دی 1390, 23:12 عصر
دوستان محترم یک سوال دارم
آیا این روشی که ایشون گفتند برای زمانی که دیتالیست نهایتا 200 تا رکورد بر میگردونه بهینه هست؟

Saber_Fatholahi
یک شنبه 04 دی 1390, 16:24 عصر
روشی که دادن ماله آقای دلشاده که ایشون منبع ذکر نکردن
و دوم اینکه این روشی که ایشون پیش گرفتن بهینه نیست البته نظر شخصی بنده هست

alonemm
یک شنبه 04 دی 1390, 18:23 عصر
باسلام:
با تشکر از دوستمون چند تذکر:
روش پیاده سازی پیجینگ مخصوصا در وب باید با کوئری باشه که فقط به تعداد نمایش رکورد واکشی بشه.
نه اینکه تمامی رکورد ها از سمت ماشین پایگاه داده واکشی بشه و فقط پشت پرده نمایش داده نشه.
در این مورد هم در سایت خیلی بحث شده.

موفق باشید.

farnooshhp
دوشنبه 05 دی 1390, 08:50 صبح
میشه چند تا از لینکهایی که بحث شده رو به من بدید؟ چون من هر چی سرچ کردم پیدا نکردم!

alonemm
سه شنبه 06 دی 1390, 14:28 عصر
توی پست های آقای مصطفی دیندار جستجو کنید.

WgsFahime
سه شنبه 07 شهریور 1391, 12:21 عصر
ممنون از بابت مقاله

ولي مشكل اساسي كه اين روش داره راندمان پايين اون هستش فرض كنيد حدود 10000 ركورد در اون جدول وجود داره و قراره براي هر صفحه فقط 100 ركورد نمايش داده بشه، در اين صورت براي نمايش هر صفحه 10000 ركورد درخواست ميشه و فقط از 100 تاي اون استفاده ميشه!

روش بهينه تر اينه كه عمليات paging در سمت ديتابيش انجام بشه كه با اومدن SQL 2005 و ()ROW_NUMBER استفاده از اين روش ميسر شده

با سلام میشه روش بهینه رو کامل توضیح بدید یا لینک اموزش ش رو لطفا بزارید

mjt10063
سه شنبه 07 خرداد 1392, 18:44 عصر
دوستان روش بهینه این صفحه بندی چطوریه؟؟

الان با این ستور پروسیجر بهینه میشه
ALTER PROCEDURE Select_User_Emtehan
(
@startRowIndex int,
@pageSize int
)

AS

Begin
SET NOCOUNT ON;
SET @startRowIndex = @startRowIndex + 1
Select name, family, user_name from userreg where roleid <> 1 and roleid <> 3
End
RETURN

خواهشن جواب بدید