كنترل های پويا در ASP.NET ( بخش دوم )
در اين بخش به بررسی يك نمونه مثال كاربردی خواهيم پرداخت تا توان خود را جهت ايجاد كنترل های سرويس دهنده به صورت پويا افزايش دهيم .
به دليل استفاده از كنترل <asp:Literal > ، در ابتدا با اين كنترل و جايگاه استفاده از آن آشنا می شويم .
كنترل سرويس دهنده <asp:Literal >
در زمان كدينگ برنامه های وب به مواردی برخورد خواهيم كرد كه لازم است متن و يا تگ های XHTML را به يك PlaceHolder به منظور كمك در مديريت و فرمت كنترل هائی كه به صورت پويا ايجاد شده اند ، اضافه نمائيم . به عنوان نمونه ، ممكن است لازم باشد كه يك پاراگراف ، خطوط خالی و يا كاراكترهای خاصی را به همراه كنترل ها استفاده نمائيم تا آنها با يك فرمت مناسب بر روی صفحه نمايش داده شوند . با توجه به اين كه متن ، رشته و يا تگ های XHTML را نمی توان در PlaceHolder قرار داد ، می بايست آنها را توسط اسكريپت در زمان ايجاد كنترل ها به PlaceHolder اضافه نمود . در چنين مواردی می توان از كنترل <asp:Literal > استفاده نمود .
ايجاد كنترل Literal توسط اسكريپت همانند ساير كنترل های سرويس دهنده در ASP.NET است . بدين منظور كافی است كه كنترل به عنوان يك كنترل Literal تعريف و به خصلت Text آن يك متن و يا رشته مبتنی بر XHTML نسبت داده شود و در ادامه آن را به PlaceHolder اضافه كرد .از كنترل های Literal به تعداد مورد نياز می توان در يك PlaceHolder استفاده نمود .
در كد زير ، يك كنترل Literal تعريف تا در ادامه يك خط خالی در بين ساير كنترل های پويای ايجاد شده ، اضافه نمايد .
|
Dim MyBreak As Literal |
مثال : ايجاد كنترل های سرويس دهنده با استفاده از اسكريپت
در اين مثال قصد داريم متناسب با هر يك از گروه مقالات تعريف شده در بانك اطلاعاتی مقالات ، دكمه هائی را بر روی يك فرم وب قرار دهيم تا كاربران پس از كليك بر روی هر يك از آنها ، مقالات مربوط به گروه انتخابی را مشاهده نمايند .دكمه ها به صورت پويا و در زمان اجراء ايجاد خواهند شد و متناسب با تغيير داده موجود در بانك ، وضعيت آنها نيز تغيير خواهد كرد . شكل زير ، خروجی برنامه را نشان می دهد .

بدين منظور از يك بانك اطلاعاتی اكسس با نام Maghalat_Srco.mdb كه شامل دو جدول Article_Type و Article_Spec است ، استفاده خواهيم كرد . در اولين جدول با نام Article_Type ، گروه های مختلف مقالات ذخيره می گردد .
|
جدول Article_Type | |
|
نام فيلد |
نوع |
|
Group_ID |
AutoNumber ، Primery Key |
|
Name |
Text |
|
Description |
Text |
در جدول دوم با نام Article_Spec ، مشخصات هر يك از مقالات ذخيره می گردد .
|
جدول Article_Spec | |
|
نام فيلد |
نوع |
|
Article_ID |
AutoNumber ، Primery Key |
|
Group_ID |
Number , Integer |
|
Title |
Text |
در ادامه يك فرم وب با نام Show_Article_By_Group.aspx را ايجاد می نمائيم كه در هر يك از بخش های Script و Html آن از امكانات متعددی استفاده شده است .
در بخش Html از سه كنترل سرويس دهنده با اهداف زير استفاده شده است :
-
<asp:PlaceHolder> : تعريف يك ناحيه برای نمايش كنترل هائی كه آنها را به صورت پويا و در زمان اجراء متناسب با داده موجود در بانك اطلاعاتی ايجاد خواهيم كرد . در اين مثال ، برای هر گروه مقاله تعريف شده در بانك اطلاعاتی يك button به صورت پويا ايجاد خواهد شد .
-
<asp:AccessDataSource> : با استفاده از كنترل منبع داده فوق ، به بانك اطلاعاتی Maghalat_Srco.mdb دستيابی و در اولين مرتبه ( زمان استقرار صفحه در حافظه و از طريق روتين page_Load ) ، متناسب با داده موجود در جدول Article_Type ، دكمه های مورد نظر را ايجاد خواهيم كرد . از كنترل فوق در مرتبه دوم و از طريق روتين Get_Articles نيز استفاده خواهد شد تا متناسب با دكمه ای كه كاربر بر روی آن كليك نموده است ، مقالات مربوط به آن گروه از جدول Article_Spec بازيابی و در Gridview نمايش داده شوند .
-
<asp:GridView> : از كنترل فوق به منظور نمايش مقالات مربوط به يك گروه خاص استفاده می گردد ( ساده ترين نوع استفاده از يك GridView ) .
در بخش script از دو روتين Page_Load و Get_Article با اهداف زير استفاده شده است .
-
Page_Load : در اين روتين ، پس از دستيابی به بانك اطلاعاتی اشاره شده ، اطلاعات موجود در جدول Article_Type بازيابی و متناسب با داده موجود ، دكمه هائی برای هر يك از گروه مقالات ايجاد خواهد شد . علاوه بر ايجاد پويای هر button ، سبك نمايش Button و توليد Event handler مورد نياز ( Get_Articles ) نيز از طريق اين روتين انجام خواهد شد .
-
Get_Articles : در اين روتين ، متناسب با اين كه كاربر بر روی كدام button كليك نموده است ، يك query به صورت پويا و پارامتريك ايجاد و اجراء می گردد . در نهايت زمينه نمايش ركوردهای بازيابی شده در Gridview نيز فراهم می گردد .
|
<%@ Import Namespace="System.Data.OleDb" %> |
توضيحات
-
پس از استقرار صفحه در حافظه ، بانك اطلاعاتی فعال و متناسب با داده موجود در جدول Article_Type ، برای هر گروه مقاله يك button ايجاد خواهد شد .
-
برای هر ركورد يك شی جديد Button ايجاد و به خصلت Text آن ، مقدار Name ( مربوط به ركورد بازيابی شده كه نشاندهنده نام گروه مقاله است ) نسبت داده می شود . برای نمايش مطلوب Button ، برخی خصلت های آن مقداردهی می گردند ( نظير نوع فونت و يا اندازه آن ) .
-
با توجه به اين كه دكمه ها به عنوان يك Command button پيكربندی شده اند ، خصلت CommandName معادل Group_ID در نظر گرفته شده و در ادامه مقدار Group_ID به روتين Get_Articles ارسال تا مقالات مربوط به گروه انتخابی را در يك GridView نمايش دهد .
-
يك Command Event توسط اسكريپت برای button مشخص می گردد كه به برنامه فرعی Get_Articles اشاره می نمايد . در نهايت ، button به PlaceHolder اضافه می شود .
-
از طريق حلقه تكرار ، هر يك از دكمه ها ايجاد و به PlaceHolder اضافه می شوند . در اين مثال ، شش button ايجاد خواهد شد چراكه جدول Article_Type حاوی شش ركورد است ( شش نوع گروه برای مقالات تعريف شده است ) و متناسب با كاهش و يا افزايش گروه مقالات تعداد Button بر روی فرم وب تغيير خواهد كرد.
-
بلافاصله پس از هر Button يك زوج فضای خالی به منظور تفكيك افقی دكمه ها از يكديگر قرار می گيرد . بدين منظور از كنترل Literal كه مقدار خصلت Text آن معادل "nbsp; &" در نظر گرفته شده است ، استفاده می گردد . اين كنترل پس از اين كه يك Button در PlaceHolder مستقر گرديد ، در مكان مربوطه درج خواهد شد .
-
همچنين از يك خط خالی پس از نمايش سه button در هر سطر ، استفاده شده است . اين كاراكتر با استفاده از يك كنترل Literal به PlaceHolder اضافه شده است كه مقدار خصلت آن " </br >" در نظر گرفته شده است .
-
از يك شمارنده برای تشخيص اضافه شدن يك Literal به PlaceHolder استفاده شده است تا به كمك آن بتوانيم تشخيص دهيم كه آيا در يك سطر سه Button نمايش داده شده است و يا خير.
در صورتی كه عبارت Counter Mod 3 = 0 درست باشد يك خط خالی به كمك كنترل Literal به PlaceHolder اضافه خواهد شد .