10 septiembre 2008

Creación de controles dinámicos en ASP.NET

Una de las cosas que siempre quise realizar en .NET fué la creación de controles dinámicos en tiempo de ejecución pero como nunca me había visto en la necesidad de crearlos no lo había hecho... hasta hoy :) que requerí generar controles dinámicos de acuerdo a las necesidades de los usuarios de cierta aplicación.


Para el siguiente ejemplo voy a explicar cómo crear cuántos textboxs y dropdownlist sean necesarios en tiempo de ejecución. Lo primero que se necesita realizar es la declaración de los arreglos de los controles requeridos de la siguiente manera:


static TextBox[] arregloTextBoxs;
static DropDownList[] arregloCombos;
static int contadorControles;


Luego defino la creación de los controles dinámicos en el evento del botón que creará dichos controles


protected void btnAgregar_Click(object sender, EventArgs e)
{
try
{
int numeroRegistro = contadorControles;
TextBox nuevoTxt = new TextBox();
nuevoTxt.ID = "txt" + numeroRegistro.ToString();
nuevoTxt.Width = 400;
arregloTextBoxs[numeroRegistro] = nuevoTxt;
DropDownList nuevoCmb = new DropDownList();
nuevoCmb.ID = "cmb" + numeroRegistro.ToString();
nuevoCmb.Items.Add("---Seleccione el Plazo---");
nuevoCmb.Items.Add("Corto Plazo");
nuevoCmb.Items.Add("Mediano Plazo");
nuevoCmb.Items.Add("Largo Plazo");
nuevoCmb.SelectedIndex = 0;
arregloCombos[numeroRegistro] = nuevoCmb;
AgregarControles(nuevoTxt, nuevoCmb);
contadorControles++;
}
catch (Exception ex)
{
lblContador.Text = ex.Message;
}
}


El método que agrega los controles dinámicos en un control Panel para que el usuario los pueda utilizar


protected void AgregarControles(TextBox txt, DropDownList cmb)
{
try
{
pnlMain.Controls.Add(txt);
pnlMain.Controls.Add(new LiteralControl(" "));
pnlMain.Controls.Add(cmb);
pnlMain.Controls.Add(new LiteralControl("
"));
}
catch (Exception ex)
{
lblContador.Text = ex.Message;
}
}


OJO: pnlMain es un control de tipo Panel en el cual voy agregando los controles dinámicos.


Finalmente, en el evento Page_Load de la página se debe "redibujar" los controles cada vez que se recargue la página:


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
lblContador.Text = "";
arregloTextBoxs = new TextBox[20];
arregloCombos = new DropDownList[20];
contadorControles = 0;
}

try
{
for (int i = 0; i < contadorControles; i++)
AgregarControles(arregloTextBoxs[i], arregloCombos[i]);
}
catch (Exception ex)
{
lblContador.Text = ex.Message
}
}

Eso es todo!!!! espero que a alguien le sea útil como lo fue para mi el día de hoy :)


Saludos!!!

PD: asi queda la página...