PDA

View Full Version : Paging کردن DataList



hdv212
یک شنبه 15 مهر 1386, 20:42 عصر
سلام
میخواستم ببینم چطوری میشه Datalist رو paging کرد و چطوری براش تعداد رکوردهای هر صفحه رو مشخص کنیم.

shahab_ksh
یک شنبه 15 مهر 1386, 21:18 عصر
این یکی از روشهاست !

یکی از موضوعاتی که معمولا برنامه نویسان محیط 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 رو به کنترل مورد نظرمون اضافه کنیم

hdv212
یک شنبه 15 مهر 1386, 23:07 عصر
shahab_ksh جان دستت درد نکنه، زحمت کشیدی، نمیدونم چرا اینقدر پیچیده س اینکار، یعنی مایکروسافت فکر اینکار رو نکرده بوده ؟ بهرحال یه لینک دیگم من پیدا کردم که میتونید از اینجا (http://www.asp.net/learn/data-access/tutorial-44-cs.aspx) ببینید، اینم به خوبی گفته.

shahab_ksh
یک شنبه 15 مهر 1386, 23:09 عصر
یعنی مایکروسافت فکر اینکار رو نکرده بوده ؟


در VS 2008 این مشکل بر طرف شده

hdv212
سه شنبه 17 مهر 1386, 06:44 صبح
بازم ممنون ولی من هنوز موفق نشدم این کار رو انجام بدم، چون dataList رو در Design Mode رسم کردم و DataSourceID اونو به یه SqlDataSource وصل کردم که اونم از طریق Design Mode پیکربندی شده، حالا وقتی کد شما رو مینویسم نمیدونم در قسمت CodeView بهش دسترسی داشته باشم، اگه مشکلمو واضحتر بگم اینه که من اجزا datalist رو در قسمت source view به فیلدهای متناظرش بایند کردم، حالا وقتی تابع شما رو در بخش code صفحه ام مینویسم و اونو به ذیتالیستم بایند میکنم، تمام فیلدهای بایند شده پاک میشن، راح حل چیه ؟

hector2000
سه شنبه 17 مهر 1386, 14:11 عصر
سلام
پیشنهاد من اینست که امکان paging را با دستورات sql پیاد سازی بکنی.مگر اینکه بخواهی با vs2008 کار کنی.
موفق باشی

snisni63
سه شنبه 24 مهر 1386, 00:32 صبح
سلام
پیشنهاد من اینست که امکان paging را با دستورات sql پیاد سازی بکنی.مگر اینکه بخواهی با vs2008 کار کنی.
موفق باشی

سلام
اگر داری نمونه شو بده بی زحمت
در مورد نمایش مشکلی ندارم. من به DataList ام امکان ویرایش و حذف هم اضافه کردم. آیا با این روش می شه اونا رو هم پوشش داد؟

با تشکر

mohi_ka2
سه شنبه 24 مهر 1386, 18:48 عصر
سلام
منم با Paging در در DataGride مشکل دارم .:ناراحت: چندین بار هم زدم ولی کسی جواب نمی ده:افسرده:. من در DataGride نمی تونم Paging کنم. کسی نیست کمک کنه؟