ورود

View Full Version : مشکل در AddHandler



Ehsan Rafsanjani
دوشنبه 21 آذر 1384, 23:35 عصر
مشکل در AddHandler
توی صفحه من یک کلید وجود داره که باید با کلیک اون یک کلید دیگه توی صفحه بوجود بیاد
کد زیر رو براش نوشتم:
Dim bt1 As Button

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

bt1 = New Button
bt1.Text = "ehsna"
AddHandler bt1.Command, AddressOf test1

PlaceHoder1.Controls.Add(bt1)
End Sub


Sub test1(ByVal s As System.Object, ByVal e As CommandEventArgs)
.
.
.
.
End Sub
حالا مشکل من این جاست که وقتی Button1 کلیک می شود و bt1 نمایش داده میشه
1 روال test1 اجرا نمی شه
2 بعد از کلیک دوباره صفحه بدون bt1 لود میشه


* این در حالی که اگر کدهای بوجود آمدن کلید جدید رو در روال PageLoad قرار بدیم مشکل حل میشه ولی من میخوام با کلیک کردن Button1 این کار رو انجام بدم
اگه کسی از دوستان بتونه کمکم کنه و نمونه کد صحیح رو برام بزاره خیلی ممنون میشم

iekrang
سه شنبه 22 آذر 1384, 07:55 صبح
این نظری که میدم به نوعی پاک کردن صورت مسئله ست ولی خب... چرا از خاصیت visible استفاده نمیکنید؟
در هر صورت به نتیجه رسیدید جواب رو حتماً برای ما هم بنویسید تا استفاده کنیم.
موفق باشید.

Ehsan Rafsanjani
سه شنبه 22 آذر 1384, 15:30 عصر
می شه بطور موقت این کار رو برای چند تا کلید محدود انجام داد ولی صفحه من طوری که تعداد کلید ها اصلا محدود نیست و حتما باید هوشمند این کار رو انجام داد
به هر حال اگه از دوستان کسی بتونه کمک کنه خیلی ممنون آخه بدجوری گیر کردم

titbasoft
پنج شنبه 24 آذر 1384, 17:03 عصر
1 روال test1 اجرا نمی شهاگر به lifetime صفحات وب توجه کنید جواب ساده است. به ترتیب اجرای چند روال زیر توجه کنید:
1) page load
2) control events
3) peage prerender
شما در زمانی که نوبت اجرای یک event هست دارید تازه اون رو می سازید. این اتفاق با هر بار درخواست صفحه میافته و پس از ارسال اون صفحه برای کلاینت تمام منابع سیستم آزاد میشه. web form ها و کنترل های اون ها (جواب مشکل دوم) بر خلاف windows form ها فقط بین زمان درخواست تا ارسال برای client زنده هستند و باید با استفاده از view state , session و یا cookie حالت رو رد گیری کرد.

یه کم سریع نوشتم و کمی گنگه اگه نیاز به توضیح بیشتر هست بگید تا بیشتر توضیح بدم.

Ehsan Rafsanjani
پنج شنبه 24 آذر 1384, 17:38 عصر
خیلی ممنون که جوابمو دادین در حقیقت من یک صفحه دارم که موقعی که لود می شه یک تعداد کلید (N) مثلا با نام کلید1 توش ایجاد می شه و با کلیک هر کلید1 یک کلید دیگه ایجاد می شه با نام کلید2 و خود این کلید یک روال خاص خودشو داره که یک سری عملیات رو انجام می ده
مشکل من دوتاست
1- موقعی که به هر دلیلی صفحه رفرش می شه دکمه های خلق شده توسط دکمه 1 از بین رفته
2- زیر روال کلید 2 اجرا نمیشه

من رو ی این مشکل خیلی وقت گذاشتم
توی MSdn خیلی گشتم یک مثال گذاشته بود که تا حدودی جوابمو داد ولی بازم مشکل دارم!?



Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
If ViewState("controlsadded") Is Nothing Then
AddControls()
End If
End Sub

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
MyBase.LoadViewState(savedState)
If ViewState("controlsadded") = True Then
AddControls()
End If
End Sub

Private Sub AddControls()
Dim dynamictextbox As New TextBox
dynamictextbox.Text = "(Enter some text)"
dynamictextbox.ID = "dynamictextbox"
Dim dynamicbutton As New Button
AddHandler dynamicbutton.Click, AddressOf dynamicbutton_Click
dynamicbutton.Text = "Dynamic Button"
Panel1.Controls.Add(dynamictextbox)
Panel1.Controls.Add(New LiteralControl("<BR><BR>"))
Panel1.Controls.Add(dynamicbutton)
ViewState("controlsadded") = True
End Sub

Private Sub dynamicbutton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Dim tb As TextBox
tb = CType(Panel1.FindControl("dynamictextbox"), TextBox)
Label1.Text = Server.HtmlEncode(tb.Text)
End Sub


مشکل من اینجاست که در صفحه من باید ابتدا کلید 1 در روال load خلق بشه بهد با کلیک کلید 1 کلید 2 تولید بشه و با کلیک کلید 2 مثلا روال test1 اجرا بشه
اگه از دوستان کسی بتونه یک نمونه کد برام بزاره خیلی ممنون میشم

titbasoft
پنج شنبه 24 آذر 1384, 23:29 عصر
به کد زیر توجه کنید:

<%@ Page Language="vb" %>
<HTML>
<body>
<form id="Form1" method="post" runat="server">
<script runat="server">
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim c As Integer
If Not IsNothing(viewstate("Dynamic_Button_Counts")) Then
For c = 0 To viewstate("Dynamic_Button_Counts") - 1
Dim nb As New Button
nb.ID = "btn_" & c & "_ID"
nb.Text = viewstate("btn_" & c & "_Text")
AddHandler nb.Click, AddressOf Button_Click
PlaceHolder.Controls.Add(nb)
Next
End If
End Sub


Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Response.Write(CType(sender, Button).ID & " has been clicked. it's text is: " & CType(sender, Button).Text)
End Sub

Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
If IsNothing(viewstate("Dynamic_Button_Counts")) Then
ViewState.Add("Dynamic_Button_Counts", "0")
End If
ViewState.Add("btn_" & ViewState("Dynamic_Button_Counts") & "_Text", txtText.Text)
ViewState("Dynamic_Button_Counts") += 1

Dim c As Integer = ViewState("Dynamic_Button_Counts") - 1
Dim nb As New Button
nb.ID = "btn_" & c & "_ID"
nb.Text = viewstate("btn_" & c & "_Text")
PlaceHolder.Controls.Add(nb)
End Sub
</script>
<P><asp:textbox id="txtText" runat="server"></asp:textbox>
<asp:Button id="cmdAdd" runat="server" Text="Add New" OnClick="cmdAdd_Click"></asp:Button></P>
<P>
<asp:PlaceHolder id="PlaceHolder" runat="server"></asp:PlaceHolder></P>
</form>
</body>
</HTML>

و اما چند نکته:
1) کنترل ها رو توی page_load ایجاد می کنیم. چون هندلر اونها باید قبل از فراخوانی هندلر کنترل های صفحه به اون کنترل ها اضافه شده باشه.
2) آخرین کنترل که پس از کلیک روی cmdAdd باید ساخته بشه توی روال cmdAdd_Click ساخته میشه. دقت کنید که اضافه شدن هندلر به کلید جدید لازم نیست. در این request رویداد کلیک از cmdAdd فراخوانی شده و می دانیم حتما روی کلید جدید کلیک نشده. اما چون در form_load به کنترل ها اضافه نشده اگر در این روال اون رو به کنترل ها اضافه نکنیم باید یکبار صفحه post back بشه تا کنترل جدید نمایش داده بشه.
3) برای حفظ تعداد و text هر کلید جدید از viewstate کمک می گیریم

Ehsan Rafsanjani
شنبه 26 آذر 1384, 11:07 صبح
خیلی ممنون از راه حلی که نوشتین .............. در ادامه تکمیل مثال شما مطلبی در همین رابطه توی قسمت مقالات گذاشتم
http://www.barnamenevis.org/forum/showthread.php?t=34654