Creación de controles dinámicamente

Es muy típico tener que generar controles dinámicamente en una página ASP.NET. El proceso de creación de controles dinámicamente es muy simple aunque nos puede llevar por el camino de la amargura sino tenemos algunos conceptos claros. Como punto de partida vamos a empezar con este código

protected void Page_Load(object sender, EventArgs e)    {       

for (int i = 0; i < 5; i++)

{           

DropDownList dropDownList = new DropDownList();

dropDownList.ID = string.Format("dropDownList{0}", i);

dropDownList.Items.Add("--");

dropDownList.Items.Add(i.ToString());

form1.Controls.Add(dropDownList);       
}   
} 

Como vemos el código es simple. Creamos 5 DropDownList, le añadimos 2 elementos, y los añadimos  al form1 de nuestra página aspx. El resultado es el siguiente:

 

Ahora bien, está es la forma correcta de realizar este proceso. Si estudiamos un poco el ciclo de vida de las páginas aspx de .net (http://msdn2.microsoft.com/en-US/library/ms178472.aspx) vemos que el sitio correcto para crear nuestros controles dinámicamente es en evento PreInit. Una vez que sabemos estos cambiamos nuestro código por el siguiente:

    protected override void OnInit(EventArgs e) { 

for (int i = 0; i < 5; i++)

{

DropDownList dropDownList = new DropDownList();

dropDownList.ID = string.Format("dropDownList{0}", i);

dropDownList.Items.Add("--");

dropDownList.Items.Add(i.ToString());

form1.Controls.Add(dropDownList);

} 

base.OnInit(e);

}

Con seguiremos los consejos de Microsoft y seguro que tarde o tempranos nos ahorraremos auténticos quebraderos de cabeza. Una cosa lógica sería querer actuar sobre el evento SelectedIndex de los DropDownList para actualizar algo. Bien para esto sólo tenemos que modificar nuestro código un poco y añadir estas líneas al proceso de creación de los controles

    dropDownList.AutoPostBack = true;

    dropDownList.SelectedIndexChanged += new EventHandler(dropDownList_SelectedIndexChanged);

El método para manejar el evento sería el siguiente

    void dropDownList_SelectedIndexChanged(object sender, EventArgs e)   
{       
DropDownList dropDownList = (DropDownList)sender;   
}

Así tenemos en dropDownList el control que ha lanzado el evento. Próximamente veremos cómo realizar este proceso pero con controles de usuario y no con lo genéricos de .NET. El proceso en esencia es el mismo, pero habrá que usar el ViewState.

Published martes, 20 de noviembre de 2007 3:53 by Indigo

Comments

# Creación de controles dinámicamente

martes, 20 de noviembre de 2007 11:40 by www.programame.net

Es muy típico tener que generar controles dinámicamente en una página ASP.NET. El proceso de creación de controles dinámicamente es muy simple aunque nos puede llevar por el camino de la amargura sino tenemos algunos conceptos claros...

# Creación de controles dinámicamente

jueves, 22 de noviembre de 2007 13:46 by Noticias externas

Es muy típico tener que generar controles dinámicamente en una página ASP.NET. El proceso de creación

# re: Creación de controles dinámicamente

sábado, 24 de noviembre de 2007 10:00 by jairo gatjens

Exelente el articulo, yo estoy tratando de crear un gridview   dinamicamente , me parece que con este ejemplo lo puedo lograr..

gracias

# re: Creación de controles dinámicamente

lunes, 26 de noviembre de 2007 6:35 by Indigo

Me alegro que te haya resultado útil. Te recomiendo mi nuevo artículo sobre GridViews.

www.todoasp.net/.../extender-gridview.aspx

# re: Creación de controles dinámicamente

lunes, 26 de noviembre de 2007 6:46 by Indigo

Por cierto, si tienes algun duda pásate por los foros y seguro que alguna solución encontramos.

# re: Creación de controles dinámicamente

sábado, 16 de febrero de 2008 22:49 by eloy

HOLA

SOY NUEVO EN ASP.NET Y TENGO UN PROBLEMA, CUANDO CREO DROPDOWNLIST DINAMICOS Y LE DOY UN CLIC A UN BOTON PARA QUE GUARDE LA INFOMRACION DEL DROPDONWLIST LOS AL HACER EL POSBACK CON EL BOTON SE ME BORRAN LOS DROPDONWLIST

Y POR LO TANTO SE ME PIERDE LA INFOMRACION.... SERIA DE MUCHISIMA AYUDA SI ME AYUDARA A RESOLVER ESTE PROBLEMA  GRACIAS...

# re: Creación de controles dinámicamente

martes, 19 de febrero de 2008 5:46 by Indigo

Hola, mejor postea esta duda en el foro, es de libre acceso (no tienes que registrarte). Para ayudarte un poco, ¿en que punto de la ejecución de la página creas los controles?

# re: Creación de controles dinámicamente

lunes, 31 de marzo de 2008 19:29 by OMAR ROMERO alias NOMERCY777

Contestando a lo que pone "eloy" de que pierde la informacion sus DropDownList cuando oprime un boton; pues la solucion es muy facil para TODOS los controles en general; pongan la propiedad EnableViewState en false (de donde esten poniendo sus controles dinamicos: ya sea Table, Panel [pero eviten usar estos ultimos dan mas lata programarlos])

O pongan

protected override void OnInit(EventArgs e)

   {

       if(!IsPostBack)

       {

        //aqui el llenado de sus controles

       }

       else

       {

        //aqui vuelven a llenar sus controles pero usas         /        //algo como esto cuando estas usando algun boton

        BotonFuntionScreens = Request.Form["__ctl00_IndexContent_tspFun_State__"];  

       }

   }

//Donde el Request.Form es relativo al control que tiene //la opcion

# re: Creación de controles dinámicamente

lunes, 07 de abril de 2008 16:33 by Luna

Hola,

Me podrian colaborar con este problema:

He creado un userControl el cual lo agrego dinamicamente a la pagina y asignandole unas propiedades que se eligieron (el usuario) a traves de un popup. hasta ahi no tengo problema, pero cuando se abre otro popup y necesito adicionar otro control, la pagina se recarga ypierdo el anterior control. supongo que debo adicionarlo al viewstate, de hehco lo intente con

ViewState.Add  pero me genera un error de serializacion

si alguien esta interezado en ayudarme, le envio el codigo para que me entienda mejor.

muchas gracias

# re: Creación de controles dinámicamente

viernes, 09 de mayo de 2008 0:22 by Felipe

Buenas Tardes

La situación que tengo es la misma que varios ya han mencionado anteriormente.  Creo controles dinamicamente, pero despues del primero Postback la información se pierde.  Se supone que con el EnableViewState en true debería mantener la información de los controles, alguien sabe por que esto no sucede? el único sitio para crear los controles dinámicos y se comporten como se espera es el evento OnInit?

gracias!

# re: Creación de controles dinámicamente

viernes, 25 de julio de 2008 0:25 by Gabriel

CdropDownList.SelectedIndexChanged += new EventHandler(dropDownList_SelectedIndexChanged);

Esa parte del codigo.. como seria en vb??? es igual? o se tiene q escribir de una manera distinta.. solo ..eso.. gracias

# re: Creación de controles dinámicamente

viernes, 25 de julio de 2008 11:52 by Indigo

Hola,

en vb.net es distinto, hay que usar addhandler (msdn.microsoft.com/.../6yyk8z93(VS.80).aspx) por lo que esa linea quedaría

AddHandler CdropDownList.SelectedIndexChanged, AddressOf Me.dropDownList_SelectedIndexChanged

Si tienes alguna otra duda ya sabes donde estoy.

# re: Creación de controles dinámicamente

viernes, 10 de octubre de 2008 18:50 by MIRINDA

Hola buen día, espero me puedan ayudar necesito meter información a un dropdownlist desde codigo he buscado en varios foros y lo hago de esta manera

Protected Sub PerInsp_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles PerInsp.SelectedIndexChanged

       PerInsp.Items.Add("hola")

   End Sub

Pero al momemnto de correr mi pagina no me muestra el texto.. no se si estoy haciendo algo mal o me falta agregar algo.

En las propiefdades del elemento tengo solo esto

<asp:DropDownList ID="PerInsp" runat="server" Width="130px" style="position: relative" CssClass="TextGen" AutoPostBack="True" EnableViewState="true" OnTextChanged="PerInsp_SelectedIndexChanged" />

ESPERO ME PUEDAN AYUDAR REALMENTE YA ESTOY DESESPERADA :(

# re: Creación de controles dinámicamente

lunes, 13 de octubre de 2008 14:42 by Indigo

Hola, podrías hacer la pregunta en mi nuevo foro. La dirección es http://www.microcode.es/foros

Muchas gracias.

# re: Creación de controles dinámicamente

sábado, 20 de diciembre de 2008 12:55 by estela

Hola! tengo un problema al enviar datos desde una web from a la base de datos en sql, no me los gusrda en las tablas

el codigo es el siguiente:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Data;

using System.Data.SqlClient;

using System.Configuration;

namespace WebApplication1

{

   public partial class WebForm1 : System.Web.UI.Page

   {

       protected void Page_Load(object sender, EventArgs e)

       {

           SqlConnection coneccion = new SqlConnection();

           coneccion.ConnectionString = ConfigurationSettings.AppSettings["cadenaConeccion"];

           coneccion.Open();

           SqlDataAdapter Data = new SqlDataAdapter("SELECT RolID FROM dbo.Roles order by RolID desc", coneccion);

           DataSet Datas = new DataSet();

           Data.Fill(Datas);

           if (Datas.Tables[0].Rows.Count == 0)

           {

               txtRolID.Text = "0";

           }

           else

           {

               txtRolID.Text = Convert.ToString(Convert.ToInt32(Datas.Tables[0].Rows[0][0].ToString()) + 1);

           }

           coneccion.Close();

           Data.Dispose();

           Datas.Dispose();

       }

       protected void txtDescrip_TextChanged(object sender, EventArgs e)

       {

       }

       protected void ButtonguardarEmple_Click(object sender, EventArgs e)

       {

           try

           {

               SqlConnection coneccion = new SqlConnection();

               coneccion.ConnectionString = ConfigurationSettings.AppSettings["CadenaConeccion"];

               coneccion.Open();

               String sql = "insert into dbo.Roles (RolID,Descripcion) values (" +

                   txtRolID.Text + ",'" + txtDescrip.Text + "')";

               SqlCommand comando = new SqlCommand(sql, coneccion);

               comando.ExecuteNonQuery();

               txtRolID.Text = Convert.ToString(Convert.ToInt32(txtRolID.Text) + 1);

               txtDescrip.Text = "";

               coneccion.Close();

               comando.Dispose();

           }

           catch

           {

               Console.WriteLine("Caught exeption");

           }

       }

   }

}

Porfavor les suplico ayuda

# re: Creación de controles dinámicamente

viernes, 13 de marzo de 2009 17:46 by Viure

Los controles deben crearse en el Init o PreInit, y recreados en cada postback en el mismo sitio.

No se puede guardar un control en el viewstate, porque no es serializable ( explicado en plan burdo, no puede convertir ese dato en una cadena ).

Se pueden guardar los valores de ese control en el viewstate y una vez recreado en el Init, puedes devolver el estado de sus valores en el Load ( en el Init no se ha cargado aun el viewstate logicamente y no se puede recuperar ).

# re: Creación de controles dinámicamente

miércoles, 29 de abril de 2009 17:35 by Luis Alberto

Hola buen consejo, ya lo hice y funciona gracias, pero ahora he hecho eliminar los controles, uno por uno ó dos a la vez, pero no consigo moverlos de posicion, para que no se vean los espacios vacios de los conroles eliminados, te agredeceria que me echaras un cable.

# re: Creación de controles dinámicamente

jueves, 13 de agosto de 2009 0:20 by trinity

Hola amigos, que tal, estoy con el problema de generar el evento de und dropdownlist de manera dinamica, ya puse el código que mencionan al inicio, pero no me queda, ya que nunca entra al evento selectedindexchanged , hace el postback y desaparece mi ddl, y no entra al evento, que creen k haga falta,,, porfavor necesito de su ayuda.. gracias.

# re: Creación de controles dinámicamente

lunes, 01 de febrero de 2010 20:45 by yerkor

Estoy generando tablas dinamiscas, agregarndo un DropDownList por fila, despues trato de sacar el valos de DropDownList y siempre me devuelve el primer item, alguien me puede ayudar???

Leave a Comment

(required) 
(required) 
(optional)
(required) 
Powered by Community Server (Non-Commercial Edition), by Telligent Systems