هنگام طراحی صفحه ها مواردی پیش می آید که اجزای صفحه هنگام نمایش دقیقا ً مشخص نیستند . مثلا ً می خواهیم مشخصات یک کاربر را وارد سیستم کنیم بدین شکل که اگر در dropdown انتخاب شد که کاربر مدیر سیستم است مشخصات مدیر را باید برای وی پر کنیم ، اگر مشخص شد که کاربر مدیر پروژه است مشخصات دیگری برای ورود اطلاعات نمایش داده می شود و الی آخر . راه های مختلفی برای پیاده سازی این کار وجود دارد که یکی از آنها استفاده از کنترل های پویا است . کنترل هایی که به انتخاب کاربر روی صفحه نمایش داده می شوند . استفاده از کنترل های پویا در ASP.NET و خواندن اطلاعات آنها بعد از Postback می تواند به یک مشکل زمان اجرای نرم افزار تبدیل شود .


تمامی کنترل ها در ASP.NET در هر بار load شدن صفحه می بایست دوباره روی صفحه نوشته شوند . اگر این کار انجام نشود بعد از postback یک صفحه سفید خواهیم داشت ! کنترل های استاندارد asp.net اگر زمان طراحی روی صفحه باشند به شکل خودکار این کار را انجام می دهند ولی وقتی خودمان کنترلی را به شکل پویا به صفحه اضافه می کنیم هر بار در زمان load می بایست کنترل را بسازیم .


می خواهیم یک User Control  داشته باشیم که به هر تعدادی که کاربر نیاز داشت روی صفحه نمایش داده شود . کاربر اطلاعات خود را وارد کرده ، سپس آنرا ذخیره کند . حالت دیگر هم زمانی است که مثلا ً می خواهیم اطلاعات ذخیره شده در بانک اطلاعاتی را به این روش ، برای ویرایش ، روی صفحه نمایش دهیم .
در ویژوال استودیو 2008 یک پروژه وبی جدید ایجاد و یک User Control به نام MyUserControl به آن اضافه می کنیم . در User Control یک Textbox قرار داده و این کد را در code behind آن می نویسیم .

Public Property MyText() As String

Get

Return TextBox1.Text

End Get

Set(ByVal value As String)

TextBox1.Text = value

End Set

End Property

یک property که مقدار textbox را با آن بتوان خواند و نوشت .


نکته : اگر می خواهید مثل همین textbox اطلاعاتی در label ذخیره کنید باید یک Hidden Field هم برای هر label روی صفحه قرار دهید  و در GET از مقدار hidden field بخوانید . من هر تلاشی کردم مقدار label بعد از postback از بین می رفت .


در یک Web Form یک کنترلی که Container باشد مثلا ً PlaceHolder قرار می دهیم . یک DropDown برای تعداد کنترلهای مورد نیاز که مقادیر آن هم دستی پر شده است . یک button برای نمایش تعداد درخواستی (set) ، یکی برای خواندن اطلاعات از user control ها  (get) و دیگری برای خواندن از بانک اطلاعاتی (load) .

برای اضافه کردن user control به container یک سابروتین لازم است که نامش CreateThem است . اگر در CreateThem گفتیم که اطلاعات را از بانک اطلاعاتی بخوان ، در زمان ساخت کنترل ها اطلاعات آنها را هم  پر می کند .

Private Sub CReateThem(Optional ByVal Vals As Boolean = False)

PlaceHolder1.Controls.Clear()

For i As Integer = 1 To DropDownList1.SelectedValue

Dim x As Control = Me.LoadControl("myUserControl.ascx")

x.ID = "T" & i.ToString

PlaceHolder1.Controls.Add(x)

If Vals Then

CType(x, myUserControl).MyText = i.ToString

End If

Next

End Sub

اطلاعات پر شده در اینجا شماره اندیس در حلقه است .


در رویداد Load صفحه تابع createThem را صدا می زنیم .

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

CReateThem()

End Sub

 

در رویداد click در کلید GET این خطوط را می نویسیم .

 

For Each c As Control In PlaceHolder1.Controls

If TypeOf c Is myUserControl Then

Response.Write(CType(c, myUserControl).MyText & "<br>")

End If

Next

 

دکمه Set احتیاج به هیچ رویداد ندارد ، فقط Postbackی که ایجاد می کند کافی است .


در دکمه Load هم می گوییم CreateThem(True) .


نمونه اجرا شده مانند شکل زیر است .

البته با روشهای دیگری هم می توان این کار را انجام داد ، مثلا ً استفاده از GridView ، یا استفاده از رویداد Init در صفحه میزبان .

 

Gravatarمرتضی
سه شنبه ساعت 00:17 , 15/11/1387
لطفا تنطیم فید وبلاگ رو روی حالتی بذارید که در فیدتون کل مطلب قابل خوندن باشه نه فقط 3-4 جمله اول هر پست.مرسی
نام :   
ايميل :      اين سايت از سيستم گراواتر استفاده می کند ، اگر در گراواتر دارای کد کاربری هستيد می توانيد از آن آدرس ايميل استفاده کنيد.  
وب سايت :   
ديدگاه :   
عدد زير را وارد کنيد :
  


  پيام شما بعد از بازبينی افزوده خواهد شد.