اصولاً شاید برای ما تازه واردها به این دنیای بزرگ .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</pre> ایجاد دوباره کنترل های موجود با فراخوانی addall() کد: End Sub</pre> ---------------------------------------------------------------------------- کد: Sub click-bt1(ByVal s As System.Object, ByVal e As System.EventArgs)</pre> ایجاد کنترل جدید با فراخوانی add() اطلاع دادن به سرور از بوجود آمدن کنترل جدید با فراخوانی CurControl کد: End Sub</pre> ---------------------------------------------------- کد: Sub addall ()</pre> فراخوانی add() برای هر یک از کنترل های موجود کد: End Sub</pre> ----------------------------------------------------------------------------- کد: Sub add(ByVal id As String)</pre> خلق کنترل جدید با توجه به id و اضافه کردن کنترل به مجموعه کنترل ها و هدایت کرن رویدادهای کنترل کد: End Sub</pre> ----------------------------------------------------------------------------- کد: Sub CurControl(ByVal id As String)</pre> مقدار دهی یک اطلاع دهنده به سرور مثلا session با توجه به id کنترل مربوطه که کنترل جدید اضافه شده است کد: End Sub</pre> شاید در نگاه اول الگوریتم پیچیده به نظر بیاید ولی مثال زیر کاملا درک آن را برای ما آسان می کند کد: ابتدا یک 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</pre>