Como criar controles ASP.NET em tempo de execução

Criando server controls em tempo de execuçãoOlá pessoal, tudo bom?

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']

8 comentários em “Como criar controles ASP.NET em tempo de execução”

  1. 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);
    });
    }

    }

    }

    1. 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

  2. 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?

    1. 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

Deixe um comentário para Atila Cancelar resposta