PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : اضافه کردن کنترل های پویا به صفحات WEB در RunTime



TAHA
09-30-2009, 06:43 AM
اضافه کردن کنترل های پویا به صفحات WEB در RunTime
اصولاً شاید برای ما تازه واردها به این دنیای بزرگ .net با این همه اساتید و بزرگان محفل نوشتن چند خط به عنوان مقاله جایز نباشد ولی به هر حال مطلبی رو که می خونین نتیجه بررسی مشکلی بود که حدود دو هفته تمام وقت من گرفت. البته یکی از دلایل اصلی وقت گرفتن این مسئله و مسئله های مشابه اینه که منابع راه حل ساده و سطح پایین تر برای من و نوآموزان .net خیلی کمه و البته مشکل اصلی اینه که ما همیشه از بالا به مشکلات فکر می کنیم یعنی پیش نیاز های حل یک مسئله رو نادید می گیریم مثلا من خودم چون به Page Life Cycle که یکی از پایه ترین اصول طراحی وب مسط نبودم به مشکلات زیادی برخوردم . به خاطر همین موضوع تصمیم گرفتم راه حل هایی که واسه مشکلات رو پیدا می کنم اینجا بزارم تا بقیه دوستان هم سطح من بتونن استفاده کنن. اساتید و دوستان رده بالا هم می تونن اشکالات ما رو ذکر کنن ................

همین طوری که درباره صفحات Web میدونین بعد از اینکه صفحات توسط موتور ASP.NET ایجاد و به کاربر ارسال شدند ، تمام اطلاعات و داده ها درباره صفحه از سرور پاک میشن، و از این جا مشکل ما برای اضافه کردن کنترل های داینامیک(پویا) به صفحات شروع می شه !

برای روشن تر شدن مشکل یک مثال ساده بد نیست!
فرض کنید یک صفحه دارید, که این صفحه در هنگام لود یک کلید ایجاد و به صفحه اضافه می کند (کلید1) . با کلیک کلید 1 ، باید کلید دیگری در صفحه ایجاد شود با نام کلید 2 ، و با کلیک کلید 2 یک روال (test) اجرا می شود.

این نکته به ذهنم رسید که حل این مسئله در windows form ها می توانست چه ساده باشد!
کافی بود فقط روال های ایجاد و رویداد های مربوط به هر کلید را بنویسیم!

ولی در web form ها یک کمی پیچیده تر است:
چون با هر بار لود صفحه تمامی اطلاعات از بین رفته اند و هیچ منبعی برای بازیابی اطلاعات وجود ندارد.
مثلا وقتی کلید 1 ایجاد شد و شما آن را کلیک کردید باید کلید 2 ایجاد گردد و به صفحه اضافه شود ولی وقتی صفحه دوباره لود می شود نمی داند که کلید 1 کلیک شده در نتیجه کلید 2 ایجاد نمی شود.

برای حل این مشکل باید این اطلاعات به نحوی در هنگام بارگزاری مجدد صفحه به سرور اطلاع داده شود
مثلا از طریق کوکی ها ، ViewState، Session و ...

نکته دیگری که در هنگام استفاده از اطلاعات ذخیره شده صفحه باید آن را رعایت کنیم Page Life Cycle است یعنی اولویت اجرای دستورات در صفحه

برگردیم به مشکل خودمان، برای حل این مشکل باید این الگوریتم رعایت شود





Private Sub Page_Load(ByVal sender As System.Object, ByVal e As - System.EventArgs) Handles MyBase.Load
ایجاد دوباره کنترل های موجود با فراخوانی addall()



End Sub
----------------------------------------------------------------------------




Sub click-bt1(ByVal s As System.Object, ByVal e As System.EventArgs)
ایجاد کنترل جدید با فراخوانی add()
اطلاع دادن به سرور از بوجود آمدن کنترل جدید با فراخوانی CurControl



End Sub
----------------------------------------------------




Sub addall ()
فراخوانی add() برای هر یک از کنترل های موجود



End Sub
-----------------------------------------------------------------------------




Sub add(ByVal id As String)
خلق کنترل جدید با توجه به id
و اضافه کردن کنترل به مجموعه کنترل ها و هدایت کرن رویدادهای کنترل



End Sub
-----------------------------------------------------------------------------




Sub CurControl(ByVal id As String)
مقدار دهی یک اطلاع دهنده به سرور مثلا session با توجه به id کنترل مربوطه
که کنترل جدید اضافه شده است



End Sub

شاید در نگاه اول الگوریتم پیچیده به نظر بیاید ولی مثال زیر کاملا درک آن را برای ما آسان می کند




ابتدا یک placeholder با id=ph و یک کنترلlabel با id=label1 به صفحه اضافه می کنیم

Dim bt As Button

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If IsPostBack Then
addall()
Else
add("ehsan")
End If
End Sub
'-----------------------------------
Sub Click_bt(ByVal s As System.Object, ByVal e As System.EventArgs)
If Session("ali") <> True Then
add("ali")
CurControl("ali")
End If
End Sub
'---------------------------------
Sub addall()
add("ehsan")
If Session("ali") = True Then
add("ali")
End If
End Sub
'---------------------------------
Sub add(ByVal id As String)
bt = New Button
bt.ID = id
bt.Text = id
If id = "ehsan" Then
AddHandler bt.Click, AddressOf Click_bt
Else
AddHandler bt.Click, AddressOf test
End If
ph.Controls.Add(bt)
End Sub
'----------------------------
Sub CurControl(ByVal id As String)
If id = "ali" Then Session("ali") = True
End Sub
'-----------------------------
Sub test(ByVal s As System.Object, ByVal e As System.EventArgs)
Label1.Text = "ok"
End Sub

امیدوارم این مقاله هر چند کم تونسته باشه به شما کمک کنه