1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

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

شروع موضوع توسط minaaa ‏29/1/11 در انجمن .Net

  1. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,773
    تشکر شده:
    6,457
    امتیاز دستاورد:
    113


    اصولاً شاید برای ما تازه واردها به این دنیای بزرگ .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>