segunda-feira, 30 de setembro de 2013

Criando controles dinâmicos ASP.NET com C#


Já esteve desenvolvendo sua aplicação e chegou em algum momento que não tinha idéia de quantos controles iria usar? E agora o que fazer? Que tal criar esses controles de forma dinâmica, em tempo de execução,  lembrando que não teremos que impotar namespaces ou algo do tipo apenas um mecanismo que lembre os controles criados de forma dinâmica, uma maneira de fazer é utilizando array que será o usado com exemplo.


No .CS de nossa pagina Default, vamos declarar de forma static um Button chamdo o btn_arr , e um static int chamado btn_count. Iremos criar uma copia dos controles a partir do btn_arr e teremos o controle das quantidades no btn_count, veja o código abaixo:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page
{
    static Button[] btn_arr = new Button[20];
    static int btn_count;

    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

No evento Page_Load(), vamos ler a matriz e recriar de forma dinâmica o que foi armazenado, para adicionar utilizaremos o controle Controls.Add de nosso controle de contadores (pnlMain) que ira adicionar a coleção, veja exemplo:
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page
{
    static Button[] btn_arr = new Button[20];
    static int btn_count;

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (btn_arr[0] is Button)
            {
                //Criar um botão para cada salvo na matriz
                foreach (Button button in btn_arr)
                {
                    add_button(button);
                }
            }
        }
        catch (Exception ex)
        {
            lblStatus.Text += ex.Message.ToString();
        }
    }

    protected void add_button(Button button)
    {
        try
        {
            //Adicionando um container na pagina
            pnlCentral.Controls.Add(button);
            //Adicionando um ENTER depois do Controle
            pnlCentral.Controls.Add(new LiteralControl("<br>"));
        }
        catch (Exception ex)
        {
            lblStatus.Text += ex.Message.ToString();
        }
    }
}

Vamos utilizar o HTLM abaixo para o exemplo de nosso artigo:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<head runat="server">
    <title>Controles de Forma Dinâmica</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <table width="600" border="0" align="center" cellpadding="5" cellspacing="1" bgcolor="#cccccc">
<tr>
<td width="100" rowspan="2" align="right" bgcolor="#eeeeee" class="header1">
    Adicionando um controle de forma dinâmica:</td>
<td align="center" bgcolor="#FFFFFF"> <br />
<asp:Panel ID="pnlCentral" runat="server" Height="300px" Width="500px">
</asp:Panel>
<br /> &namp;bsp;
</td>
</tr>
<tr>
<td align="center" bgcolor="#FFFFFF">
<asp:button ID="btnCriar" runat="server" Text="Criar Botão"
        OnClick="btnSubmit_Click" />ID do Botão:
<asp:TextBox ID="txtID" runat="server" Width="64px"></asp:TextBox>
    Cor do Botão:<asp:TextBox ID="txtForeColor" runat="server" Width="64px"></asp:TextBox> <br />
    Texto do Botão:<asp:TextBox ID="txtText" runat="server" Width="64px"></asp:TextBox> <br />
<asp:label ID="lblStatus" runat="server"></asp:label> </td>
</tr>
</table>
    </div>
    </form>
</body>
</html>
Agora iremos adicionar o evento click do botão Criar botão ficará assim:
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page
{
    static Button[] btn_arr = new Button[20];
    static int btn_count;

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (btn_arr[0] is Button)
            {
                //Criar um botão para cada salvo na matriz
                foreach (Button button in btn_arr)
                {
                    add_button(button);
                }
            }
        }
        catch (Exception ex)
        {
            lblStatus.Text += ex.Message.ToString();
        }
    }

    protected void add_button(Button button)
    {
        try
        {
            //Adicionando um container na pagina
            pnlCentral.Controls.Add(button);
            //Adicionando um ENTER depois do Controle
            pnlCentral.Controls.Add(new LiteralControl("<br>"));
        }
        catch (Exception ex)
        {
            lblStatus.Text += ex.Message.ToString();
        }
    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        try
        {
            //Criando a instancia do botão
            Button new_button = new Button();
            new_button.ID = txtID.Text;
            new_button.ForeColor = System.Drawing.Color.FromName(txtForeColor.Text);
            new_button.Text = txtText.Text;
            //adicionar o botão ao array
            btn_arr[btn_count++] = new_button;
            //Chamando a função para adicionar.
            add_button(new_button);
            lblStatus.Text += "Criando o botão " + new_button.ID + " e adicionando a cor " + new_button.ForeColor;
        }
        catch (Exception ex)
        {
            lblStatus.Text += ex.Message.ToString();
        }
    }
}

VS 2008 - ASP .NET 3.5 - C#

Para baixar a solução apresentada neste artigo, utilize as opções abaixo:

0 comentários:

Postar um comentário