Neste post demonstro como criar controles (Server Controls) ASP.NET em tempo de execução. Tal técnica pode ser muito importante quando sabemos ao certo quais e quantos serão os controles ASP.NET que precisaremos em nosso formulário.
Arquivo: ServerControlsTempoExecucao.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ServerControlsTempoExecucao.aspx.cs" Inherits="Especializacao2011_2012.ServerControlsTempoExecucao" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Criando controles ASP.NET em tempo de execução</title> </head> <body> <form id="form1" runat="server"> <div> <h2>Criando controles ASP.NET em tempo de execução</h2> Selecione quantas caixas de texto você precisa:<br /> <asp:RadioButtonList ID="rblQuantidade" runat="server" AutoPostBack="True" RepeatDirection="Horizontal"> <asp:ListItem>1</asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> </asp:RadioButtonList> <asp:Panel ID="pnlControles" runat="server" GroupingText="Server Controls criados em tempo de execução"> </asp:Panel> </div> <asp:Button ID="btnEnviar" runat="server" onclick="btnEnviar_Click" Text="Enviar" /><br /> <asp:Label ID="lblValores" runat="server"></asp:Label> </form> </body> </html>
Arquivo: ServerControlsTempoExecucao.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Especializacao2011_2012
{
public partial class ServerControlsTempoExecucao : System.Web.UI.Page
{
//No ciclo de vida de uma página ASP.NET este é o primeiro método que pode ser manipulado, por isso, a criação dos controles está sendo realizada nele.
//Repare que tivemos que utilizar o Request.Form para conseguir obter o valor do RadioButtonList, que neste momento, ainda não é objeto para o ASP.NET e por isso seu valor está apenas nos parametros do método POST
protected void Page_PreInit(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request.Form["rblQuantidade"]))
{
int qtd = int.Parse(Request.Form["rblQuantidade"]);
for (int i = 1; i <= qtd; i++)
{
//Criando os controles
Label lbl = new Label();
lbl.ID = "lbl" + i.ToString();
lbl.Text = string.Format("<br/>Informe o valor {0} <br/>", i.ToString());
TextBox txt = new TextBox();
txt.ID = "txt" + i.ToString();
txt.Columns = 30;
//Adicionando os controles a um container, no caso, um Panel
pnlControles.Controls.Add(lbl);
pnlControles.Controls.Add(txt);
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
//Como obter os valores informados nos controles criados em tempo de execução (exemplo)
protected void btnEnviar_Click(object sender, EventArgs e)
{
lblValores.Text = string.Empty;
//Obtendo todos os controles que estão dentro do Panel
foreach (Control ctl in pnlControles.Controls)
{
//Verificando se o controle é da classe TextBox (há outras formas)
if (ctl.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
lblValores.Text += ((TextBox)ctl).Text + "<br/>";
}
}
}
}
Um grande abraço a todos,
Eduardo Henrique Rizo
[twitter-follow screen_name='eduardorizo' show_count='yes']

Cara… Te amo!!
Fiquei horas procurando exatamente isso!
Já estava desistindo.
Que bom que o post tenha lhe ajudado.
Quanto ao “Te amo”… deixe isso pra lá !! 🙂
Grande abraço e boa sorte,
Eduardo
tbm te amo cara, salvo minha pele para fazer um controle de estoque
🙂
Eduardo boa Noite
estou precisando de ajuda urgentimente.
Tenho um controle chamado estoque que recebe um cookie com o ID do produto cadastrado, e ao fazer isso ele resgata os dados dos tamanho referente ao produto e gera com controles necessarios tem runtime como mostra o codigo abaixo
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
HttpCookie cookie = Request.Cookies[“IDProduto”];
if (cookie != null)
{
List clsTamanhoProduto = TamanhoProdutoBLL.GetTamanhoProdutoByIDProduto(int.Parse(cookie.Value.ToString()));
clsTamanhoProduto.ForEach(delegate(TamanhoProdutoTO _clsTamanhoProduto)
{
TamanhoTO clsTamanho = new TamanhoTO();
clsTamanho = TamanhoBLL.GetTamanhoByID(_clsTamanhoProduto.IDTamanho);
// Montando os Label e TextBox
Label lbl = new Label();
lbl.ID = “lblTamanho” + clsTamanho.Tamanho;
lbl.Text = “Tamanho :” + clsTamanho.Tamanho;
TextBox txt = new TextBox();
txt.ID = “txtTamanho” + clsTamanho.Tamanho;
txt.SkinID = “TextBoxPequeno”;
pnlControles.Controls.Add(lbl);
pnlControles.Controls.Add(txt);
});
}
}
}
porem quando vou salvar ele não esta encontrando os itens que tem nesse panel, ele somente mostra que tem 1 literal sendo que eu não defini literal em lugar nenhum.
Segue o código do salvar
protected void Button1_Click(object sender, EventArgs e)
{
MembershipUser User = Membership.GetUser();
HttpCookie cookie = Request.Cookies[“IDProduto”];
EstoqueTO clsEstoque = new EstoqueTO();
clsEstoque.IDProduto = int.Parse(cookie.Value);
clsEstoque.IDUsuario = (Guid)User.ProviderUserKey;
List clsTamanhoProduto = TamanhoProdutoBLL.GetTamanhoProdutoByIDProduto(int.Parse(cookie.Value.ToString()));
//Obtendo todos os controles que estão dentro do Panel
foreach (Control control in pnlControles.Controls)
{
//Verificando se o controle é da classe TextBox (há outras formas)
if (control is TextBox)
{
clsTamanhoProduto.ForEach(delegate(TamanhoProdutoTO _clsTamanhoProduto)
{
clsEstoque.Quantidade = int.Parse(((TextBox)control).Text);
clsEstoque.IDTamanho = _clsTamanhoProduto.IDTamanho;
EstoqueBLL.Insert(clsEstoque);
});
}
}
}
Atila, tudo bom?
O que está ocorrendo aí é um erro relacionado ao ciclo de vida da página ASP.NET.
Procure criar os controle no método Page_PreInit do form, pois dessa forma os mesmos estarão disponíveis no ViewState e também fica conhecido para o restante da classe.
O exemplo desse post (http://www.eduardorizo.com.br/2011/07/29/como-criar-controles-asp-net-em-tempo-de-execucao/) demonstra a criação dos controles no método Page_PreInit, sendo que você deve declará-lo manualmente no codebehind do form.
Certo?
[]s
Eduardo Henrique Rizo
Tentei implementar esse exemplo, mas quando vou adicionar o controle criado no pnlControles, o mesmo ainda não existe, pois a página não foi criada. Como esse seu exemplo funcionou?
Olá, tudo bom?
Você reparou que todo o código de criação está na sobrescrita do método Page_PreInit?
Verifique os comentários que coloquei no meio do código.
Abraços,
Eduardo H. Rizo