PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : كنترل های پويا در asp.net



TAHA
10-28-2009, 10:36 PM
كنترل های پويا در ASP.NET ( بخش اول )


كنترل های سرويس دهنده معمولا" در زمان طراحی و با توجه به نياز يك برنامه در صفحات ASP.NET قرار می گيرند . در چنين مواردی ، پياده كنندگان در زمان طراحی نسبت به تعداد و نوع كنترل های سرويس دهنده مورد نياز آگاهی كامل دارند . به عبارت ديگر ، دانش لازم برای استفاده از كنترل ها در زمان طراحی وجود دارد . در برخی موارد ممكن است دانش لازم به منظور استفاده از كنترل ها ( نوع و يا تعداد كنترل مورد نياز ) در زمان طراحی وجود نداشته باشد . اين وضعيت در مواردی كه اطلاعات صفحه از طريق منابع داده خارجی تامين می گردد ، بسيار مشهود می باشد .
به عنوان نمونه ، فرض كنيد می خواهيم دكمه هائی را بر روی يك فرم وب توليد نمائيم كه با كليك بر روی هر از آنها ، كتاب های موجود در بانك اطلاعاتی مرتبط با آن گروه خاص ، نمايش داده شوند . تعداد button مورد نياز به تعداد گروه های تعريف شده در بانك اطلاعاتی ، بستگی خواهد داشت . با اين كه در زمان طراحی ممكن است شش گروه كتاب در بانك اطلاعاتی وجود داشته باشد ، ولی ممكن است متناسب با رشد اطلاعات در بانك ، گروه های جديدی تعريف و يا برخی گروه ها حذف گردند . در چنين مواردی ، تعداد button ايجاد شده بر روی فرم متاثر از تعداد گروه های تعريف شده در بانك اطلاعاتی است . بديهی است تا زمانی كه به بانك اطلاعاتی دستيابی نشده باشد نمی توان به اطلاعات مورد نياز جهت ايجاد buttons دستيابی داشت . به عبارت ديگر ، هدف ايجاد buttons در زمان اجراء است نه در زمان طراحی . در چنين مواردی ، كنترل ها به صورت پويا و در زمان استقرار صفحه در حافظه ايجاد خواهند شد .

ايجاد كنترل ها با استفاده از اسكريپت
برای ايجاد يك كنترل با استفاده از اسكريپت در ابتدا می بايست يك شی كنترل را به عنوان يك نوع كنترل تعريف نمود . نوع كنترل را می توان يكی از نوع های استاندارد كنترل های سرويس دهنده در نظر گرفت . مثلا" برای يك ايجاد يك كنترل <asp:label> ، می بايست آن را به عنوان يك نوع label ، برای ايجاد يك كنترل <asp:button> ، آن را به عنوان يك نوع button و برای ايجاد يك كنترل <asp:TextBox> آن را به عنوان يك نوع TextBox تعريف كرد .
كد زير نحوه تعريف يك كنترل را نشان می دهد :

کد:
Dim MyLabel As New Label
Dim MyButton As New Button
Dim MyTextBox As New TextBox

كنترل <asp:PlaceHolder>
پس از ايجاد يك كنترل ، به منظور نمايش آن بر روی صفحه می بايست آن را به يكی از مجموعه های Controls اضافه نمود . صفحه، دارای يك مجموعه كنترل با نام page.collection است كه تمامی كنترل های موجود در يك صفحه و ساير كنترل های جديدی را كه در ادامه می توان به اضافه نمود را شامل می شود . معمولا" ترجيح داده می شود كه يك ناحيه خاص بر روی صفحه تعريف و در ادامه كنترل های جديدی را به آن اضافه نمود .
كنترل <asp:PlaceHolder> ، ناحيه ای را مشخص می نمايد كه می توان كنترل های ايجاد شده به صورت پويا را در آن قرار داد . با نسبت دادن يك كنترل به مجموعه كنترل PlaceHolder ، امكان مشاهده كنترل بر روی صفحه فراهم می گردد .
كد زير نحوه ايجاد يك كنترل PlaceHolder را نشان می دهد .

کد:
<asp:PlaceHolder id="id" Runat="Server"/>
كنترل PlaceHolder خود فضائی را بر روی صفحه اشغال نخواهد كرد و صرفا" ناحيه ای را بر روی صفحه به منظور افزودن كنترل های پويا ، رزو می نمايد . به كنترل فوق می بايست يك id نسبت داده شود تا امكان دستيابی به آْن از طريق اسكريپت فراهم گردد .

اضافه كردن كنترل به يك PlaceHolder
پس از تعريف يك PlaceHolder ، با استفاده از متد Add می توان كنترل مورد نظر را به آن اضافه نمود . كد زير نحوه استفاده از متد Add كنترل PlaceHolder را نشان می دهد .

کد:
PlaceholderId.Controls.Add(Control)


PlaceHolderId ، شناسه ( id ) كنترل PlaceHolder است كه از طريق آن می توان به كنترل دستيابی داشت. Control ، نام كنترلی كه می بايست به صورت پويا به صفحه اضافه گردد .
در مثال زير‌ ، يك PlaceHolder تعريف و در ادامه يك كنترل label جديد ايجاد و به PlaceHolder اضافه شده است .



<SCRIPT Runat="Server">

Sub Page_Load

Dim MyLabel As New Label
MyPlaceHolder.Controls.Add(MyLabel)

End Sub

</SCRIPT>



<form Runat="Server">

<asp:PlaceHolder id="MyPlaceHolder" Runat="Server"/>

</form>


كنترل label بر روی صفحه و در مكان مشخص شده توسط PlaceHolder نمايش داده می شود . در ادامه می توان كنترل های ديگری را با استفاده از اسكريپت توليد و به PlaceHolder اضافه نمود ( در خطوط بعد از كنترل label نمايش داده می شوند ) . در صورت نياز می توان چندين كنترل PlaceHolder را تعريف و در مكان های مختلف صفحه مستقر نمود تا در ادامه بتوان كنترل های توليد شده توسط اسكريپت را در هر يك از آنها با توجه به ضرورت های موجود ، اضافه نمود .
با توجه به اين واقعيت كه كنترل های توليد شده توسط اسكريپت به عنوان بخشی از view state صفحه در نظر گرفته نخواهند شد ، می بايست برای ايجاد آنها از روتين Page_load استفاده گردد .

دستيابی به خصلت های يك كنترل توسط اسكريپت
در مثال قبل ، كنترل label به صورت پيكربندی پيش فرض و بدون هيچگونه تنظميات خاصی بر روی صفحه نمايش داده می شود . در صورت تمايل می توان خصلت های مرتبط با يك كنترل را به صورت پويا و به كمك اسكريپت مقداردهی نمود .
كد زير ، بازنويسی مثال قبلی است كه در ابتدا خصلت های متعدد كنترل label مقداردهی و در ادامه كنترل فوق به مجموعه كنترل های PlaceHolder اضافه شده است .

کد:


<%@ Import Namespace="System.Drawing" %>

<SCRIPT Runat="Server">

Sub Page_Load

Dim MyLabel As New Label
MyLabel.id = "Label01"
MyLabel.Text = "اين كنترل توسط اسكريپت توليد شده است"
MyLabel.ForeColor = Color.FromName("blue")
MyLabel.Font.Bold = True
MyLabel.Font.Size = FontUnit.Parse("14pt")
MyPlaceHolder.Controls.Add(MyLabel)

End Sub

</SCRIPT>

<form Runat="Server">

<asp:PlaceHolder id="MyPlaceHolder" Runat="Server"/>

</form>


توليد رويدادهای كنترل توسط اسكريپت
در مواردی‌ كه كنترل هائی نظير Button كه به كمك آنها می توان اسكريپت های موجود در يك برنامه را فعال نمود به صورت پويا ايجاد می گردند ، می بايست event handler مورد نظر را به منظور فراخوانی برنامه فرعی نيز مشخص نمود . برای ايجاد يك event handler توسط اسكريپت از كد زير استفاده می گردد .

AddHandler Control.Event, AddressOf Subprogram


control ، نام كنترلی است كه event handler به آن نسبت داده خواهد شد . Event ، نوع Event handler را مشخص می نمايد ( مثلا" Click ) و Subprogram ، نام روتينی است كه پس از بروز رويداد می بايست فعال گردد .
در مثال زير ، پس از تعريف يك Buuton و تنظيم خصلت های آن در زمان اجراء ، يك event handler نيز تعريف شده است تا پس از كليك بر روی دكمه فوق ، روتين مورد نظر فعال (My_Subprogram ) و پاسخگوی رويداد ايجاد شده باشد .

کد:


Dim MyButton As New Button
MyButton.id = "Button1"
MyButton.Text = "Click Me"
AddHandler MyButton.Click, AddressOf My_Subprogram
MyPlaceHolder.Controls.Add(MyButton)


در مثال فوق ، يك handler برای رويداد Click به كنترل Button اضافه شده است . My_Subprogram ، روتينی است كه پس از بروز رويداد ( كليك بر روی button ) ، فعال و پاسخگوی رويداد ايجاد شده است .
پس از اين كه يك Button به صفحه اضافه گرديد ( در مكان MyPlaceHolder ) ، عملكرد آن مشابه زمانی است كه از يك Button در زمان طراحی استفاده شده باشد:

کد:
<asp:Button id="Button1" Text="Click Me" OnClick="My_Subprogram" Runat="Server"/>
نوع رويداد توليد شده توسط اسكريپت كه می توان آن را به كنترل ها اضافه نمود ، همانند event handler استفاده شده به همراه كنترل ها در زمان طراحی است . مثلا" كنترل button قادر به تشخيص دو event handler با نام OnClick و OnCommand است . بنابراين ، می توان با استفاده از اسكريپت دو رويداد فوق را برای يك button توليد نمود . زمانی كه يك رويداد Command توسط اسكريپت توليد می گردد ، می توان خصلت های CommandName و CommandArgument را نيز برای button تنظيم نمود .
در بخش دوم به بررسی ساير عمليات در ارتباط با كنترل های پويا خواهيم پرداخت .
__________________