Hur skall man använda AddHandler och Adressof om man skapar upp en knapp dynamiskt i en class som man sedan laddar i en placeholder. Försöker förklara igen. Jag vill skapa upp lite knappar dynamiskt i en class som jag sedan skickar till en placeholder på min ascx-sida. Men sedan vill jag också kunna fånga upp knapptryckningar. Det som är problemet är Föresten hur i hela friden kan servern veta att följande html skall hoppa in i subben "command_makulera" ? Sök på ASP.NET Page Life Cycle på exempelvis Google eller MSDN, du måste läsa på om de olika eventen för att se varför det inte fungerar. Jag har läst på MSDN och på ASP.net om delegates, events mm men jag kan ändå omvandla det de något som hjälper min situation. Om du kör automatisk "EventWireUp" kommer eventhandlers att tilldelas vid ett visst ögonblick i livscykeln - DÅ måste kontrollen finnas (därav tipset om att läsa på om just livscykeln för Page-objektet). Grattis! Skam den som ger sig! ;) Det var inte den... utan Page_Init och CommandEventHandler som var lösningen Ah, trodde att du hade ändrat det tidigare...Deklarera event för dynamiska knappar
Skall de angess i classen
Så här gör jag när jag skapar upp en imagebutton i en ascx :
<code>
Dim cb As New ImageButton
With cb
.ImageUrl = "pic_sajt/trashcan.gif"
.CssClass = "trashcan"
.ID = o.ToString()
.CommandArgument = CStr(o)
.ToolTip = "Makulera"
End With
AddHandler cb.Command, AddressOf command_makulera
</code>Sv:AddHandler ...
Men jag får bara fel :
Error Value of type 'System.EventHandler' cannot be converted to 'System.Web.UI.WebControls.CommandEventHandler'.
Error Method 'Protected Sub command_makulera(sender As Object, e As System.Web.UI.WebControls.CommandEventArgs)' does not have the same signature as delegate 'Delegate Sub EventHandler(sender As Object, e As System.EventArgs)'.
Min klass ser ut som följer :
<code>
Min klass ser ut som följer :
Imports Microsoft.VisualBasic
Public Class grid_col
Public Id As String
Public ImageUrl As String
Public Tooltip As String
Public CommandArgument As String
Public EditType As et
Public Visible As Boolean
Public _Plh As New PlaceHolder
Public _Addressof As EventHandler
Public Enum et
Normal = 1
Label = 2
Textbox = 3
Checkbox = 4
Imagebutton = 5
Image = 6
End Enum
Public Function MAKEPLH() As PlaceHolder
MAKEPLH = Nothing
Dim test As New PlaceHolder
Select Case EditType
Case et.Imagebutton
Dim lbu As New ImageButton
With lbu
.ID = Id
.ImageUrl = ImageUrl
.ToolTip = Tooltip
AddHandler .Command, _Addressof
End With
test.Controls.Add(lbu)
End Select
Return test
End Function
End Class
</code>
På ascx sidan ser det ut så här :
<code>
Partial Class adm_beslut_insertupdate
Inherits System.Web.UI.UserControl
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
With objCol
.Id = "2345_"
.EditType = grid_col.et.Imagebutton
.ImageUrl = ""
._Addressof = AddressOf command_makulera
End With
PlaceHolder1.Controls.Add(objCol.MAKEPLH)
End Sub
'Tar hand om knapp tryckning
Protected Sub command_makulera(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
' hämtar id för tryckt knapp
Dim item_number As String = e.CommandArgument()
'Här har jag lite mer kod på vad som skall hända
End Sub
End class
</code>Sv: AddHandler ...
Från classen:
<code>
Public _Addressof As EventHandler
AddHandler .Command, _Addressof
</code>
Från Ascx:en:
<code>
._Addressof = AddressOf command_makulera
</code>Sv:AddHandler ...
Jag har jämfört HTML-koden för en Imagebutton som är skapad dynamiskt i min ascx via följande kod:
<code>
Dim cb As New ImageButton
With cb
.ImageUrl = "pic_sajt/trashcan.gif"
.CssClass = "trashcan"
.ID = o.ToString()
.CommandArgument = CStr(o)
.ToolTip = "Makulera"
End With
AddHandler cb.Command, AddressOf command_makulera
</code>
med den Imagebutton som jag skapat via min class och de ser i princip identiska ut. Men ändå hoppar man inte in i subben command_makulera vid click.
....?Sv: AddHandler ...
<code>
<input type="image" name="ucMainwindow$ctl00$2" id="ucMainwindow_ctl00_2" title="Makulera" class="trashcan" src="pic_sajt/trashcan.gif" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ucMainwindow$ctl00$2", "", true, "", "", false, false))" style="border-width:0px;" />
</Code>Sv: AddHandler ...
Det är av yttersta vikt att man lägger till dynamiska kontroller vid rätt tidpunkt, samt att man återskapar dom vid PostBacks.
Lycka till!Sv:AddHandler ...
Det jag tillslut vill åstakomma med min kod är en class som dynamiskt bygger upp en gridd. Sv:AddHandler ...
Alla buttons syns när de ska. Det som är problemet är att synka ihop den dynamiskt skapade knappen med den sub som skall utföra händelsen vi klickadet.Sv: AddHandler ...
Du kan lägga till en kontroll så sent som OnPreRender (den kommer synas), men gör du det inte under exempelvis OnInit kommer du inte få någon funktionalitet, ViewState etc.Sv:AddHandler ...
EventWireUp = AutoEventWireup ?
<code>
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
</code>
Öppnar mitt objekt från "Page_PreRender" OnInit ? i VB...Sv: AddHandler ...
"AutoEventWireUp" löser ofta många problem! :)Sv:AddHandler ...
Sv: AddHandler ...
Som sagt, lägger man till kontroller för sent i livscykeln kommer de ej att inkluderas i kontrollträdet och då kan man inte göra mycket annat än att få dom utritade på skärmen.
Slutet gott, allting gott! :)