PDA

View Full Version : اضافه کردن کنترل های پویا به صفحات WEB در RunTime



Ehsan Rafsanjani
شنبه 26 آذر 1384, 11:02 صبح
اضافه کردن کنترل های پویا به صفحات 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
امیدوارم این مقاله هر چند کم تونسته باشه به شما کمک کنه .................. با یک کمی تغییر می شه این کار رو برای اضافه کردن N بار کنترل پویا انجام داد........ شما می تونین امتحان کنید و نتیجه رو برای تکمیل این مقاله این جا بزارین .............. ممنون

titbasoft
شنبه 26 آذر 1384, 11:31 صبح
یه نکته اون هم اینکه به جای استفاده از session بهتره از viewstate استفاده کنید چون در مراجعات بعدی ممکنه به مشکل بخورید.

skywork
شنبه 04 آذر 1385, 00:07 صبح
با عرض سلام خدمت جناب آقای نصیری

من مشکل ساخت کوئری برای بانک اطلاعاتی دارم و نمی دونم چگونه درست کنم در محیط ASP.NET راهنماییم کنید
درضمن من هر بار که محیط آی اس پ خراب می شه مجبورم دوباره محیط رو باز سازی کنم و بعد مشکل اتصال پیدا میکنه و من مجبورم به طور کامل از دات نت خارج شم ...................
OleDbDataAdapter1.fill(dataset11)

و همچنین محیط رو به گونه ای طراحی کردم که بصورت چند تکس باکس در بالا برای نشان دادن محتویات بانک و چند باتون ابتدا و انتها و بعدی و قبلی قرار دادم ولی وقتی کدی که برای آن باتون نوشتم محتویات رکورد بعدی را نشون نمیده ..... برای باتون
DIM POSITION AS INTEGER
DIM ID AS STRING
POSITION =0
ME.VIEWSTATE("POSITION")=POSITION
ID = DATASET11.TABLES(0).ROWS(POSITION).ITEM("AU_ID")
DATAVIEW1.ROWFILTER ="AU_ID = '" & ID &"'"
TEXTBOX1.DATABINDING()
LABEL3.TEXT=POSITION + &" OF " &DATASET11.TABLES(0).ROWS.COUNT

AHASBCB@YAHOO.COM
AHASBCB@NOAVAR.COM