lunes, 14 de julio de 2008

Como manejar los eventos de botones creados dinámicamente en asp.net

Un amigo me consultó hace un par de días acerca de un problema que el estaba teniendo con una página en la que dinámicamente generaba unos botones, les atachaba los eventos click mediante addhandler pero en tiempo de ejecución la página aspx ignoraba olímpicamente dicha codificación.

La codificación era del siguiente estilo:


Dim btnBoton As New Button
btnBoton.Text = "Click en este botón"
Page.Controls.Add(btnBoton)


Una vez que el botón está en la página no hay forma de hacer que responda al evento click.

No podía creer que algo tan sencillo no funcionase, de modo que empecé a buscar en todo internet, aunque me imaginaba que si agregaba un campo oculto y registraba la propiedad correcta todo iba a funcionar.

Entonces, primero hay que registrar un campo oculto en la página.


Page.ClientScript.RegisterHiddenField("BotonOculto", "")


Despues definimos el botón en forma dinámica.


Dim miBoton As New Button
miBoton.Text = "Click en este boton"


Y el secreto agregar desde el lado servidor un attribute al lado cliente que directamente envie el submit de la página mas el botón clickeado


objButton.Attributes.Add("onClick", & _ "document.forms[0].BotonOculto.value='" & _
miBoton.UniqueID & "';document.forms[0].submit();")


Bien drástico y concreto, uso el Dom y envio el submit desde el evento onClick previamente registrado.

Finalmente agrego el control a la coleccion de controles de la página.


Page.Controls.Add(miBoton)


Lo unico que resta es tomar en el postback que genera dicho botón el valor del item correspondiente y listo.

Entonces en el postback:


If Page.IsPostBack Then
If Request.Item("botonOculto").Length > 0 Then
Response.Write("Usted clickeó en el botón " & _
Request.Item("botonOculto") )
End If
End If


Línea mas, línea menos, así es como debiera quedar la cosa.

Y problema resuelto !