جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


تبلیغ بانک ها در صفحات
ربات ساز تلگرام در صفحات
ایمن نیوز در صفحات
.. سیستم ارسال پیامک ..
كنترل هاي پويا در ASP.NET
-(5 Body) 
كنترل هاي پويا در ASP.NET
Visitor 1473
Category: دنياي فن آوري
كنترل هاي سرويس دهنده معمولا" در زمان طراحي و با توجه به نياز يك برنامه در صفحات 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:PlaceHolderid="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 تنظيم نمود .

كنترل سرويس دهنده <asp:Literal >

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

Dim MyBreak As Literal
MyBreak.Text = "<br/>"
MyPlaceHolder.Controls.Add(MyBreak)

مثال : ايجاد كنترل هاي سرويس دهنده با استفاده از اسكريپت

در اين مثال قصد داريم متناسب با هر يك از گروه مقالات تعريف شده در بانك اطلاعاتي مقالات ، دكمه هائي را بر روي يك فرم وب قرار دهيم تا كاربران پس از كليك بر روي هر يك از آنها ، مقالات مربوط به گروه انتخابي را مشاهده نمايند .دكمه ها به صورت پويا و در زمان اجراء ايجاد خواهند شد و متناسب با تغيير داده موجود در بانك ، وضعيت آنها نيز تغيير خواهد كرد .
بدين منظور از يك بانك اطلاعاتي اكسس با نام Maghalat_Srco.mdb كه شامل دو جدول Article_Type و Article_Spec است ، استفاده خواهيم كرد . در اولين جدول با نام Article_Type ، گروه هاي مختلف مقالات ذخيره مي گردد .

جدول Article_Type

 نام فيلد

نوع

Group_ID

AutoNumber، PrimeryKey

Name

Text

Description

Text

در جدول دوم با نام Article_Spec ، مشخصات هر يك از مقالات ذخيره مي گردد .

جدول Article_Spec

 نام فيلد

نوع

 Article_ID

AutoNumber، PrimeryKey

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" %>
<%@ Import Namespace="System.Drawing" %>
<SCRIPT Runat="Server">
Sub Page_Load
Dim DBConnection As OleDbConnection
Dim DBCommand As OleDbCommand
Dim DBReader As OleDbDataReader
Dim SQLString As String
Dim Counter As Integer = 0
DBConnection = New OleDbConnection( _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("~/OurDataBase/Maghalat_Srco.mdb"))
DBConnection.Open()
SQLString = "SELECT DISTINCT Group_ID , Name FROM Article_Type order by Name"
DBCommand = New OleDbCommand(SQLString, DBConnection)
DBReader = DBCommand.ExecuteReader()
While DBReader.Read()
  Dim MyButton as New Button
  MyButton.Text = DBReader("Name")
  MyButton.CommandName = DBReader("Group_ID")
  MyButton.Width = Unit.Parse("100px")
  MyButton.Font.Size = FontUnit.Parse("8pt")
  MyButton.Font.Name = "Tahoma"
  AddHandler MyButton.Command, AddressOf Get_Articles
  ButtonArea.Controls.Add(MyButton)
  Dim MyBlank As New Literal
  MyBlank.Text = "&nbsp;&nbsp;"
  ButtonArea.Controls.Add(MyBlank)
  Counter += 1
  If Counter Mod 3 = 0 Then
      Dim MyBreak As New Literal
      MyBreak.Text = "<br/>"
      ButtonArea.Controls.Add(MyBreak)
  End If
End While
DBReader.Close()
DBConnection.Close()
End Sub
Sub Get_Articles (Src as Object, Args As CommandEventArgs)
Dim SQLString As String
SQLString = "SELECT Title ,Description FROM Article_Spec " & _
"WHERE Group_ID = " & Args.CommandName & "
ArticlesSource.SelectCommand = SQLString
End Sub
</SCRIPT>
<form Runat="Server">
ايجاد كنترل هاي سرويس دهنده به صورت پويا
<asp:PlaceHolder id="ButtonArea" Runat="Server"/>
<asp:AccessDataSource id="ArticlesSource" Runat="Server"
    DataFile="~/OurDataBase/Maghalat_Srco.mdb"
    SelectCommand="SELECT Title , Description FROM Article_Spec "/>
<asp:GridView id="BookGrid" DataSourceID="ArticlesSource" Runat="Server" />
</form>

توضيحات

• پس از استقرار صفحه در حافظه ، بانك اطلاعاتي فعال و متناسب با داده موجود در جدول 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;&nbsp&" در نظر گرفته شده است ، استفاده مي گردد . اين كنترل پس از اين كه يك Button در PlaceHolder مستقر گرديد ، در مكان مربوطه درج خواهد شد .
• همچنين از يك خط خالي پس از نمايش سه button در هر سطر ، استفاده شده است . اين كاراكتر با استفاده از يك كنترل Literal به PlaceHolder اضافه شده است كه مقدار خصلت آن " </br >" در نظر گرفته شده است .
• از يك شمارنده براي تشخيص اضافه شدن يك Literal به PlaceHolder استفاده شده است تا به كمك آن بتوانيم تشخيص دهيم كه آيا در يك سطر سه Button نمايش داده شده است و يا خير.
در صورتي كه عبارت Counter Mod 3 = 0 درست باشد يك خط خالي به كمك كنترل Literal به PlaceHolder اضافه خواهد شد .
Add Comments
Name:
Email:  
User Comments:
SecurityCode: Captcha ImageChange Image