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:
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?
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.
;)
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
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.
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
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?
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
Bueno este ejemplo también me dio una ayuda al mismo problema
http://www.asp.net/learn/ajax-videos/video-286.aspx
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.
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
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
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
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
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.
hola que tal lo podrías hacer en c# el código soy nuevo en esto
gracias
saludos
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
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
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
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
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
Gracias Serrano, era un error mío cuando modifique tu codigo, me funciona 100%, gracias por compartir tus conocimientos, Saludos cordiales.
¿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
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
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?
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.
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
Publicar un comentario