El Blog del Leo

Compartiendo lo que aprendo

Controles dinámicos y eventos dinámicos

Todos no hemos encontrado con la necesidad de crear algún control de manera dinámica para agregarlo a un contenedor de controles en una página web. Pero ¿qué sucede cuando necesito que ese control me genere un evento?

La solución es más sencilla de lo que imaginamos, por ejemplo en Visual Basic.NET seria:

'En nuestro evento Page Load crearemos un control dinámico
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Creamos la instancia de un control de tipo Button
Dim boton As New Button
boton.Text = "Presionar boton"

'Aquí esta la gracia, AddHandler es el evento que nosotros queremos gatillar en este control dinámico
'la instrucción AddresOf nos dice que función va a controlar el evento, en este caso Button_Click la cual debe 'estar debidamente creada.
AddHandler boton.Click, AddressOf Button_Click

'Añadimos el control al formulario
form1.Controls.Add(boton)
End Sub

'Creamos la función que va a controlar el evento
Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs)
lbMuestra.Text = "Boton dinamico presionado"
End Sub

Espero que haya sido claro, les adjunto un archivo de prueba. Descargar archivo

3 comentarios:

Anónimo dijo...

Esto funciona bien pero si los objetos son dinamicos como lo solucionas?

ejemplo recorres un directorio buscando archivos txt ok
generas un checkbox por cada objeto ok
a los checkbox les agregas eventos ok

pero al momento de seleccionar el checbok deberia de mostrarte el nombre del file ok

como lo haces?

te adjunto parte de un codigo que estoy trabajando a ver si puedes solucionarlo.

Public Function cuenta() As Integer ' cuenta las imagenes en un directorio
For Each num As String In Directory.GetFiles(ruta, "*.tif", SearchOption.TopDirectoryOnly)
' creacion de checkbox
Dim u As New CheckBox ' nombre del checkbox
u.Text = num ' es la ruta de la imagen
AddHandler u.Click, AddressOf u_click ' eveto que agrego
u.Location = New Point(20, a) 'posicion de los check
u.Size = New Size(40, 40) ' tamaño de ños check
nombre_item = u.Text 'variable para usar en un msg para saber cuando seleciono el check
u.Parent = Me

Next
End Function

evento

Private Sub u_click(ByVal sender As Object, ByVal e As System.EventArgs)
MsgBox(nombre_item)
End Sub

ahora mediando un boton llamo a mi funcion

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

Leonardo dijo...

Estimado anonimo :P
Mira estuve revisando lo que me enviaste y creo haber entendido lo que querias. Que problema encontre en tu codigo. Tu variable nombre_item, se iba a reescribiendo cada vez que hacia un vuelta en el ciclo el For Each y al mostrarla siempre te salia el ultimo item. Asi que lo que hice fue mostrar el texto del checkbox que era lo que necesitabas haciendo un cast a quien llamaba al metodo y obteniendo su propiedad text.

Espero haber entendido. Abajo te dejo el codigo.


Private ruta As String = "Ruta de consulta"


Public Function cuenta() As Integer ' cuenta las imagenes en un directorio
Dim a = 0
For Each num As String In Directory.GetFiles(ruta, "*.jpeg", SearchOption.TopDirectoryOnly)
a = a + 50
' creacion de checkbox
Dim u As New CheckBox ' nombre del checkbox
u.Text = num
AddHandler u.Click, AddressOf u_click ' evento que agrego
u.Location = New Point(20, a) 'posicion de los check
u.Size = New Size(400, 40) ' tamaño de los check
u.Parent = Me
Next
End Function

'evento

Private Sub u_click(ByVal sender As Object, ByVal e As System.EventArgs)
MsgBox(DirectCast(sender, CheckBox).Text)
End Sub

'ahora mediando un boton llamo a mi funcion

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

conocuica dijo...

Revisa mi codigo, me presente como anonimo

http://conocuicavb.blogspot.com/

Seguidores

Certificaciones

Microsoft Certified Professional

Mis Tweets

Twitter