viernes, 18 de setiembre de 2009

ASP.NET – Crear textbox dinamicamente - I

viewstate

Parte I, Parte II.

Esta pregunta me la hicieron hoy, y a simple vista les pareciera algo complejo de hacer…

¿Cómo creo controles textbox de servidor de manera dinámica? por ejemplo, al click de un botón quisiera que se genere un textbox más…

Pasos:

1.- Agregamos un control de servidor asp:Placeholder y un botón al código aspx:

<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="Generar textboxes" />
<br />
<asp:PlaceHolder ID="phDinamicControls" runat="server"></asp:PlaceHolder>

</form>

2.- en el code-beside agregamos el sgte código:

Private Property QuantityDinamicControls() As Integer
Get
If ViewState("Quantity") = Nothing Then ViewState("Quantity") = 0

Return DirectCast(ViewState("Quantity"), Integer)

End Get
Set(ByVal value As Integer)
ViewState("Quantity") = value
End Set
End Property

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

Me.QuantityDinamicControls += 1

End Sub

Protected Overloads Overrides Sub CreateChildControls()

If Page.IsPostBack Then GenerateControls()

End Sub

Private Sub GenerateControls()

Dim Quantity As Integer = 0
While Quantity <= Me.QuantityDinamicControls
Dim txt As New TextBox()
txt.Attributes.Add("style", "margin-bottom: 10px")
txt.ID = "txt" + (Quantity + 1).ToString()
txt.Text = "Algún texto va aquí..."

phDinamicControls.Controls.Add(txt)
phDinamicControls.Controls.Add(New LiteralControl("<br/>"))
Quantity += 1
End While

End Sub

Les explico:

+ Tenemos una propiedad llamada QuantityDinamicControls, que nos permite guardar/recuperar (en el viewstate) la cantidad de controles que hemos generado hasta el momento.

+ Dado que estamos en un entorno web, tenemos que ver cómo hacemos para retener los valores de esos controles generados dinamicamente…. Lo que heremos es recrearlos cada vez que haya un postback al servidor, y esa operación la hacemos sobreescribiendo el método CreateChildControls().

+ Tenemos el método GenerateControls() , que generará los controles… y los irá agregando al PlaceHolder cada vez que hay un postback.

Y para terminar, si queremos recuperar los valores de los controles generados dinamicamente:

Private Function GetTxtControls() As String
Dim sb As New StringBuilder
Dim i As Integer = 0

While i <= Me.QuantityDinamicControls
Dim txt As String = "txt" + (i + 1).ToString()
Dim txtControl As TextBox = TryCast(phDinamicControls.FindControl(txt), TextBox)

sb.Append(txtControl.Text & "<br />")

i += 1
End While

Return sb.ToString

End Function

Te estarás preguntando si en cada refrescado de página los textboxes pierden su valor… la respuesta es: No te preocupes de eso… los valores se pierden y se recrean de manera transparente para ti… osea no tienes que preocuparte de ese aspecto.

Eso sería todo ;)

Parte I, Parte II.

29 comentarios:

jhinostrozac dijo...

Hola muy buena la aportación que haces acerca de los controles dinámicos, pero ahora como llamas a ese textbox que has creado?
con un request.params(ID) o como es?

Segundo Serrano dijo...

Hola jhinostrozac,

Por favor fíjate en la última parte del post, allí hay una función GetTxtControls() que me permite recuperar los textboxes creados dinámicamente.

Si esto no soluciona tu duda, a ver si detallas un poco más tu caso y vemos otra solución.

;)

Cristina dijo...

Hola, disculpen pero soy un poco nueva con esto..y justamente estaba buscando como generar controles de forma dinamica, tu codigo funciona muy bien, el problema es que no logro mostrar el contenido que hay en cada textbox, o no puedo recuperar lo escrito, me pueden dar una ayuda por favor...muchismas gracias

Segundo Serrano dijo...

Hola Cristina,

(como el comentario anterior)Por favor fíjate en la última parte del post, allí hay una función GetTxtControls() que me permite recuperar los textboxes creados dinámicamente y su contenido.

Si esto no soluciona tu duda, a ver si detallas un poco más tu caso o poner tu código para darle una chequeadita.

Saludos.

olivo dijo...

Tengo una pagina con un FRAME, desde donde puedo invocar una serie de paginas (9 en total) que contienen cajas de textos (textbox), y necesito que los datos que escribo en ellas permanezcan cada vez que yo abra la pagina, hasta que decida cambiarlos.
He usado un script ("formretain.js", pero solo consigue retener los datos de las tres primeras paginas, pues cuando introduzco datos en la cuarta (sin importar el orden), los datos de todas las paginas desaparecen. Borro las cookies y comienzo de nuevo solo para ver cada vez el mismo resultado. ¿Sabe alguie como solucionarlo? Agradeceré toda ayuda. Saludos. yoenel@hotmail.com

Segundo Serrano dijo...

Hola olivo,

No estoy seguro si tu pregunta tiene que ver con la generación dinámica de textboxes... en todo caso, a ver si nos das más detalles.

Por otro lado, si lo que quieres es retener el valor de mútiples grupos de controles, puedes usar el multiview... te dejo un enlace de ejemplo:
MultiView-Control

Cualquier cosa, comentas?

jhinostrozac dijo...

Buenas, si gracias me ha ayudado para mi problema que tenia, pero lo que quería decir es si tu escribes un texto dentro del textbox dinámico como lo llamas, para poder usar en otra pagina

jhinostrozac dijo...

Bueno este ejemplo también me dio una ayuda al mismo problema

http://www.asp.net/learn/ajax-videos/video-286.aspx

Segundo Serrano dijo...

Hola jhinostrozac,

Ya entendí lo que pides, he creado un nuevo post: http://dotnet-peru.blogspot.com/2009/11/aspnet-crear-textbox-dinamicamente-ii.html

dale una chequeada y me comentas.

Saludos.

Unknown dijo...

al tratar de recuperar los datos con la funcion GenerateControls()
me sale un error o talves no se como llamar esta funcion, como grabarias en label todos los datos

Unknown dijo...

Hola
Tengo una duda al tratat de recuperar los datos con la funcion GenerateControls() me sale un error no se si la estoy utilizando bien no se si me podrias dar un ejemplo llenando un label con los datos de los textbox creados dinamicamente

Segundo Serrano dijo...

Hola,

para recuperar los valores de los textboxes.. al final hay una función llamada GetTxtControls()

para mostrar los datos en un label harías esto:

Label1.Text = GetTxtControls()

Saludos

elviss116 dijo...

un favor ps aca esta el link de un web for parecido al de hotmail lo q kiero es q arregles el codigo para q las contraseñas no se borren aca esta el link
http://www.4shared.com/file/kxUdTty2/ASP_IV_SEM3.html

me lo envias a mi correo ps ok elviss_911@hotmail.com

gracias

Angel dijo...

Hola que tal! La verdad me ha ayudado de mucho este codigo que publicaste. muchas gracias! Pero tengo una pequenia duda, como le haces para eliminar la ultima fila? inicialmente habia creido que con hacer un decremento en 1 bastaria, pero esto lo hace hasta la segunda ocasion despues de haber pintado los textbox dinamicos. como se podria solventar esto? que al hacer clic en un boton de eliminar, se elimine el ultimo textbox creado?
Espero que me puedas ayudar, saludos.

Adrian dijo...

hola que tal lo podrías hacer en c# el código soy nuevo en esto
gracias
saludos

Segundo Serrano dijo...

Hola,
lo lamento, no tengo mucho tiempo por ahora, pero puedes usar esta herramienta que convierte de VB.NET a C#
http://converter.telerik.com/

Saludos

Unknown dijo...

HOla Serrano, me ha ayudado mucho tu codigo con unos textbox dinamicos que he creado, solo que tengo una pregunta, yo quiero leer esa información cuando le de click a un boton especifico, pero si tengo otro boton me hace lo mismo, y solo quiero que funcione para una en especifico, como hago, me urge tu ayuda, saludos cordiales.

Alex Chavez

Segundo Serrano dijo...

hola alex chavez,

no he entendido muy bien tu pregunta... si pudieras subir tu código a alguna parte y pasarnos la url para darle una chequeada.

saludos

Unknown dijo...

Gracias Serrano, fijate que mi problema no es complicado, pero no encuentro la solución adecuada unida a mi inexperiencia se vuelve complicado, talvez me doy a entender mejor, tengo un boton(button) que me genera todos los textbox dinamicos, tengo otro boton(recupera_datos) para leer los texbox dinamicos,pero en la pagina si tengo otros botones para realizar otro tipo de eventos, me hace la funcion del boton(button), es decir me crea los textbox dinamicos, como decir que solo me haga los textbox para un boton especifico?


en pocas palabras si tomo tu codigo y agrego otro boton, tambien hace la misma funcion de boutton1, gracias Serrano.
Saludos cordiales.

alex999_chavez@hotmail.com

Segundo Serrano dijo...

Hola alex chavez,

no hay problema con que los controles se creen nuevamente con el otro botòn... porque la informaciòn no se alterarà.
aún no entiendo por qué quieres evitar eso.

Saludos

Unknown dijo...

Gracias Serrano, era un error mío cuando modifique tu codigo, me funciona 100%, gracias por compartir tus conocimientos, Saludos cordiales.

Unknown dijo...

¿Cómo puedo crear dinamicamente un div (panel) y dentro un checkbox?

' SE CREA EL PANEL (DIV)
Dim pn As New Panel()
pn.ID = "pn_" & Id

' AGREGO EL PANEL A UN DIV DE SERVIDOR QUE YA EXISTE
div.Controls.Add(pn)

' SE CREA EL CHECKBOX
Dim chk As New CheckBox()
chk.ID = "chk_" & Id
chk.Text = Descripcion


' AQUI ESTA LA DUDA !!!
¿COMO AGREGO EL CHECKBOX AL DIV CREADO AL PRINCIPIO?

Gracias

Segundo Serrano dijo...

Hola Diego Campillo,

modifica tu código de esta manera:

' SE CREA EL PANEL (DIV)
Dim pn As New Panel()
pn.ID = "pn_" & Id

' SE CREA EL CHECKBOX
Dim chk As New CheckBox()
chk.ID = "chk_" & Id
chk.Text = Descripcion

'agregas el checkbox al panel
pn.Controls.Add(chk)

' AGREGO EL PANEL A UN DIV DE SERVIDOR QUE YA EXISTE
div.Controls.Add(pn)

Saludos

maialen dijo...
Este comentario ha sido eliminado por el autor.
maialen dijo...
Este comentario ha sido eliminado por el autor.
maialen dijo...

Hola Segundo;

Dentro del codigo que tienes tu para crear un textbox cada vez que le des al boton he introducido que tambien añada un DropDownList.

Lo que necesito es que cuando el valor del textbox cambie que me coja el valor que tiene el dropdownList.

Como puedo hacerlo?

Unknown dijo...

Estoy creando dinamicamente controles de acuerdo a una serie de condiciones establecidas por CheckBox y dropdownlist. El tema es que cuando valido internamente los estados de los checks para crear los controles que necesito siempre estan como inicialmente fueron cargadas. Es extraño pues con los dropdownlist no pasa eso.

Esper me puedas ayudar.

ingeniero dijo...
Este comentario ha sido eliminado por el autor.
ingeniero dijo...

hola gracias por tan valioso aporte,
el inconveniente que tengo es que necesito tener un boton mas en el formulario este boton lo creo estaticamente y es para guardar informacion el porblema es que al presionar el boton me agrega un textbox dinamico mas en vez de dejar los que ya estan gracias por la colaboracion