1 ضمیمه
پایان مشکل پیجینگ در DATA LIST
یکی از موضوعاتی که معمولا برنامه نویسان محیط 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,"i mageURL") %>' />
<asp:Label ID="Label2" runat="server" Text='<%#DataBinder.Eval(Container.DataItem,"image Name") %>'></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 رو به کنترل مورد نظرمون اضافه کنیم .
منبع : سايت پرشين تولز
نقل قول: پایان مشکل پیجینگ در DATA LIST
ممنون از بابت مقاله
ولي مشكل اساسي كه اين روش داره راندمان پايين اون هستش فرض كنيد حدود 10000 ركورد در اون جدول وجود داره و قراره براي هر صفحه فقط 100 ركورد نمايش داده بشه، در اين صورت براي نمايش هر صفحه 10000 ركورد درخواست ميشه و فقط از 100 تاي اون استفاده ميشه!
روش بهينه تر اينه كه عمليات paging در سمت ديتابيش انجام بشه كه با اومدن SQL 2005 و ()ROW_NUMBER استفاده از اين روش ميسر شده
نقل قول: پایان مشکل پیجینگ در DATA LIST
بد نبود منبع رو هم معرفی می کردی !!!!!
نقل قول: پایان مشکل پیجینگ در DATA LIST
دوست عزیز بالای فایل ضمیمه نوشتم که:خجالت:
آقای neo حرف شما کاملا درسته.ولی دیتا لیست با قابلیت پیجینگ رو همه برای ساخت گالری میخوان که شاید 50 تا رکورد بیشتر نشه.
نقل قول: پایان مشکل پیجینگ در DATA LIST
دوست عزیز خیلی ممنون از مقاله خوبتون
نقل قول: پایان مشکل پیجینگ در DATA LIST
این مقاله مال آقای دلشاد هستش....:لبخندساده:
من فکر می کنم که شما اشتباه منبع دادید....
آقای دلشاد اگر درست می گم ، تایید کنید
نقل قول: پایان مشکل پیجینگ در DATA LIST
دوستان محترم یک سوال دارم
آیا این روشی که ایشون گفتند برای زمانی که دیتالیست نهایتا 200 تا رکورد بر میگردونه بهینه هست؟
نقل قول: پایان مشکل پیجینگ در DATA LIST
روشی که دادن ماله آقای دلشاده که ایشون منبع ذکر نکردن
و دوم اینکه این روشی که ایشون پیش گرفتن بهینه نیست البته نظر شخصی بنده هست
نقل قول: پایان مشکل پیجینگ در DATA LIST
باسلام:
با تشکر از دوستمون چند تذکر:
روش پیاده سازی پیجینگ مخصوصا در وب باید با کوئری باشه که فقط به تعداد نمایش رکورد واکشی بشه.
نه اینکه تمامی رکورد ها از سمت ماشین پایگاه داده واکشی بشه و فقط پشت پرده نمایش داده نشه.
در این مورد هم در سایت خیلی بحث شده.
موفق باشید.
نقل قول: پایان مشکل پیجینگ در DATA LIST
میشه چند تا از لینکهایی که بحث شده رو به من بدید؟ چون من هر چی سرچ کردم پیدا نکردم!
نقل قول: پایان مشکل پیجینگ در DATA LIST
توی پست های آقای مصطفی دیندار جستجو کنید.
نقل قول: پایان مشکل پیجینگ در DATA LIST
نقل قول:
نوشته شده توسط
Neo Persian
ممنون از بابت مقاله
ولي مشكل اساسي كه اين روش داره راندمان پايين اون هستش فرض كنيد حدود 10000 ركورد در اون جدول وجود داره و قراره براي هر صفحه فقط 100 ركورد نمايش داده بشه، در اين صورت براي نمايش هر صفحه 10000 ركورد درخواست ميشه و فقط از 100 تاي اون استفاده ميشه!
روش بهينه تر اينه كه عمليات paging در سمت ديتابيش انجام بشه كه با اومدن SQL 2005 و ()ROW_NUMBER استفاده از اين روش ميسر شده
با سلام میشه روش بهینه رو کامل توضیح بدید یا لینک اموزش ش رو لطفا بزارید
نقل قول: پایان مشکل پیجینگ در DATA LIST
دوستان روش بهینه این صفحه بندی چطوریه؟؟
الان با این ستور پروسیجر بهینه میشه
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
خواهشن جواب بدید