Hejsan! Först brukar jag inte skriva Me. , men det spelar nog ingen roll här. Däremot tror jag du missat en deklaration i click-rutinen, dvs handles ListClick Nepp! En sak jag tänker på nu är att om du bygger tabeller och rutiner så måste den rutinen köras VARJE gång du postar eller laddar sidan för annars finns inte tabellen, dina referenser och annat. Nja. Jag har funderat på det också och tror att jag dels kan "pilla in den" i viewstate, men annars så kommer jag cacha datan i viewstate och låter då tabellen byggas om. så här ser en typisk rutin ut som jag skrev för några veckor sedan: Nu funkar det som en dans! Jag har dock ingen som helst aning om varför :-) Det vanligaste missen är just att det inte blir någon postback och eftersom inte listan finns då än så kan man heller inte referera till det. Skönt det löste sig.Koppla event till knappar
Har en egentligen ganska basal fråga som jag skäms lite över att inte kunna lösa själv men hjälp kanske jag kan få ändå...
Probemet:
Jag har en <asp:table> som jag dynamiskt skapar nya rader och celler i från Code Behind. Tabelle i sig är deklarerad som Protected WithEvents och innehåller till å börja med inga rader.
Det är i sig inget problem utan problemet ligger i att jag för varje rad skapar en knapp (eller imgagebutton) jag har inte bestämt mig ännu.
När användaren klickar på knappen ska underinformation visas för just den raden. Logiskt och inte ovanligt eller hur?
Då jag skapar knappen och lägger till den ser det ut såhär:
<code>
Dim btn as new Imagebutton()
btn.imageURL = "images/btn"
btn.CommandName = "Edit"
btn.CommanArgument = row.ThingyID
AddHandler btn.Command, AddressOf Me.ListClick
' Listclick definierad på annan plats.
td.Controls.Add(btn)
tr.Cells.Add(td)
tbl.Rows.Add(tr)
</code>
Men inte funkar det... Det funkar inte heller om jag försöker binda ClickEventet.
Övrig information: Jag har naturligtvis testat i debugläge och jag har dessutom testat med olika knapptyper.
Då knappen deklareras så kan jag inte deklarera den som annat än Dim och utan WithEvents.
Lösningen just nu är att jag istället har en LiteralControl som innehåller en dynamiskt skapad länk i HTML men ett klick på den genererar inte en postback och det vill jag helst ha.Sv: Koppla event till knappar
<info>
Private Sub ListClick_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListClick.Click
End Sub
</info>Sv: Koppla event till knappar
Faktum är att jag i det läge som jag befinner mig inte ens kan kompilera om jag följer ditt råd :-)
Saken är ju den att en deklaration av en rutin som definieras för att hantera ett visst event måste vid kompilation känna till den kontroll som rutinen är kopplad till. Dessutom ska den kopplade kontrollen måste vara definierad med WithEvents.
För att lösa detta problem låter .NET dig dynamiskt lägga till eventshandlers i den interna listan.
Exempel på detta:
<code>
Public class MyClass
Protected withevents btn as ImageButtion
private Sub btn_Click(sender as object, e as eventargs)
response.write("Hello World")
End sub
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Bind knappens klickevent till subben
if not page.ispostback then Addhandler btn.Click, AddressOf Me.btn_Click
end sub
End class
</code>
Problemet kvarstårSv: Koppla event till knappar
Sv: Koppla event till knappar
Hittills så är det i alla fall inga problem med hastigheten på 20 rader...Sv: Koppla event till knappar
<code>
While rst.Read
a = a + 1
'
lblUnread.Text = rst("unread")
lblRead.Text = rst("total") - rst("deleted")
Dim tr As New TableRow
Dim td0 As New TableCell
Dim td1 As New TableCell
Dim td2 As New TableCell
Dim td3 As New TableCell
Dim link0 As New LinkButton
Dim link1 As New LinkButton
Dim link2 As New LinkButton
Dim chk As New CheckBox
link0.CommandArgument = rst("fromid")
link1.CommandArgument = rst("mailid")
link2.CommandArgument = rst("mailid")
td0.ID = "chk" & rst("mailid")
td0.Controls.Add(chk)
td0.Width = Unit.Pixel(20)
td1.Text = rst("namn")
td1.Width = Unit.Pixel(140)
td1.Wrap = False
link1.Text = Left(Convert.ToString(rst("dtestamp")), 10)
td2.Controls.Add(link1)
td2.Width = Unit.Pixel(80)
link2.Text = Convert.ToString(rst("subject"))
td3.Controls.Add(link2)
AddHandler link1.Command, AddressOf link_command
AddHandler link2.Command, AddressOf link_command
If rst("status") = 0 Then
td1.Font.Bold = True
td2.Font.Bold = True
td3.Font.Bold = True
End If
tr.ID = rst("mailid")
tr.Attributes.Add("onMouseOver", "this.style.backgroundColor='#FFF7D7';")
tr.Attributes.Add("onMouseOut", "this.style.backgroundColor='';")
' tr.CssClass = "cBtn"
td0.Style.Add("BORDER-BOTTOM", "#dfe8e2 1px solid")
td1.Style.Add("BORDER-BOTTOM", "#dfe8e2 1px solid")
td2.Style.Add("BORDER-BOTTOM", "#dfe8e2 1px solid")
td3.Style.Add("BORDER-BOTTOM", "#dfe8e2 1px solid")
tr.Controls.Add(td0)
tr.Controls.Add(td1)
tr.Controls.Add(td2)
tr.Controls.Add(td3)
tblMailMessages.Controls.Add(tr)
If a > 5 Then Exit While
End While
</code>
Sedan
<code>
Private Sub link_command(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)
' hämtar id för produkt och produkttyp
Dim mailID As Integer = e.CommandArgument()
</code>
Du kanske kan hitta något som diffar därSv: Koppla event till knappar
I vilket fall som helst så gör nu sidan en postback även om det är ImageButtons och då kan jag nu och spara state för min tabell mellan klickningar.
Tack o storeSv: Koppla event till knappar