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