Criação de controles dinâmicos em .NET

Posted by Leticia Verta | Posted in .NET, C#, Geral | Posted on 18-12-2009-05-2008

2

Eis uma coisa que sempre encafifava minhas idéias: criação de controles dinâmicos no .NET.
Parece simples, porém, devido ao ‘complexo’ ciclo de vida das páginas da linguagem, se torna um pouco mais chatinho.
Vamos para o exemplo … que eu usei ainda hoje, diga-se de passagem :P

Criaremos uma página com um Panel e um Button

<!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>Relaxos - Controles Dinâmicos</title>
  </head>
  <body>
    <form id="form1" runat="server">
    <div>
      <asp:Panel ID="pnlTeste" runat="server" />
      <asp:Button ID="btnExibir" runat="server" Text="Botãozar" onclick="btnExibir_Click" />
    </div>
    </form>
  </body>
</html>

Agora criaremos, em tempo de execução, um TextBox e um Button – e seu respectivo evento. Exibiremos o conteúdo dos controles já adicionados através do btnExibir (notem que eu já setei um evento ao botão).

private TextBox txtDinamico;
private Button btnDinamico;
 
protected void Page_Load(object sender, EventArgs e)
{
  CriarControles();
}
 
private void CriarControles()
{
  txtDinamico = new TextBox();
  pnlTeste.Controls.Add(txtDinamico);
 
  btnDinamico = new Button();
  btnDinamico.Text = "+";
  btnDinamico.Click += new EventHandler(Adicionar);
  pnlTeste.Controls.Add(btnDinamico);
}
 
void Adicionar(object sender, EventArgs e)
{
  CriarControles();
}
 
protected void btnExibir_Click(object sender, EventArgs e)
{
  StringBuilder stbConteudo = new StringBuilder();
 
  //Pegamos todos os controles do pnlTeste
  foreach (Control oControl in pnlTeste.Controls)
  {
    //E filtramos para pegar os valores apenas dos TextBox's
    if (oControl.GetType().Name == "TextBox")
      stbConteudo.Append(String.Concat("\\nControle -> ", ((TextBox)oControl).UniqueID, " - ", ((TextBox)oControl).Text));
  }
 
  Response.Write(String.Concat("alert('" , stbConteudo.ToString(), "');"));
}

Rodando (ma oe) o projeto agora, vocês verão que os controles se perdem forever. A cada PostBack os controles somem, é como se nunca tivesse sido incluso nada ali. Isso acontece porque apenas as propriedades desses controles são serializadas, o controle em si não é, ou seja, teremos que persistir esses controles na raça … então let’s go:

public partial class ControlesDinamicos : System.Web.UI.Page
{
    private TextBox txtDinamico;
    private Button btnDinamico;
    private int qtde 
    {
        get { return Session["qtde"] == null ? 0 : Convert.ToInt32(Session["qtde"]); }
        set { Session["qtde"] = value; }
    }
    private int indice = 0;
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            //Cria o primeiro controle
            CriarControles(false);
        else
        {
            //Mantém controles posteriormente criados
            for (int c = 0; c < qtde; c++)
                CriarControles(true);
        }
    }
 
    private void CriarControles(bool Persistencia)
    {
        txtDinamico = new TextBox();
        txtDinamico.ID = String.Concat("txtDinamico", indice);
        pnlTeste.Controls.Add(txtDinamico);
 
        btnDinamico = new Button();
        btnDinamico.Text = "+";
        btnDinamico.ID = String.Concat("btnDinamico", indice);
        btnDinamico.Click += new EventHandler(Adicionar);
        pnlTeste.Controls.Add(btnDinamico);
 
        indice++;
 
        if (!Persistencia)
            qtde++;
    }
 
    void Adicionar(object sender, EventArgs e)
    {
        CriarControles(false);
    }
 
    protected void btnExibir_Click(object sender, EventArgs e)
    {
        StringBuilder stbConteudo = new StringBuilder();
 
        //Pegamos todos os controles do pnlTeste
        foreach (Control oControl in pnlTeste.Controls)
        {
            //E filtramos para pegar os valores apenas dos TextBox's
            if (oControl.GetType().Name == "TextBox")
                stbConteudo.Append(String.Concat("\\nControle -> ", ((TextBox)oControl).UniqueID, " - ", ((TextBox)oControl).Text));
        }
 
        Response.Write(String.Concat("<script>alert('" , stbConteudo.ToString(), "');</script>"));
    }
}

No código acima, quando acontece a persistência (que nada mais é a recriação de novos controles), os controles mudam os ids (Ex.: existem os controles ctl01, ctl02 … PostBack … na recriação serão ctl03, ctl04, por ai vai) e mais uma vez, cadê os dados?? Pra evitar essa bagunça, setamos a identidade de cada controle e VUALÁ! :)

Bom, agora é só colocar um ajaxzinho pra ficar biito e adequar às necessidades diárias … quem quiser o código, só clicar.

[]’s

Leticia Verta, desenvolvedora aspirante em .NET rs

Rolagem de página animado com JQuery

Posted by alex | Posted in .NET, Geral, HTML, JSP, JavaScript, POO | Posted on 11-11-2009-05-2008

0

E aí galera blz!
Sou o Alexander, mais conhecido Alex. Trabalho na Agence como webdesigner e faço freelancers através de minha empresa Lexadesign.

Neste meu primeiro post no blog dos Relaxos vou mostrar como fazer rolagem de página animada utilizando jQuery:

Começando com o HTML, montamos uma estrutura contendo título, links e imagem. A rolagem animada entre estes itens será feita por Jquery.

Criamos uma DIV #container para alinhar o conteúdo ao centro, em seguida as DIVs #um, #dois, #tres e #quatro. Cada um contendo H1, lista com links e uma imagem.

HTML:

<div id="container">
    <div id="um">
        <h1>Conteudo 01</h1>
        <ul>
            <li><a href="#dois">ir para conteúdo 02</a></li>
            <li><a href="#tres">ir para conteúdo 03</a></li>
            <li><a href="#quatro">ir para conteúdo 04</a></li>
        </ul>
        <img src="moto-mv-agusta-f4-senna-c8726.jpg" alt="" />
    </div>
    <div id="dois">
        <h1>Conteudo 02</h1>
        <ul>
            <li><a href="#tres">ir para conteúdo 03</a></li>
            <li><a href="#quatro">ir para conteúdo 04</a></li>
            <li><a href="#um">ir para conteúdo 01</a></li>
        </ul>
        <img src="9673moto.jpg" alt="" />
    </div>
    <div id="tres">
        <h1>Conteudo 03</h1>
        <ul>
            <li><a href="#quatro">ir para conteúdo 04</a></li>
            <li><a href="#um">ir para conteúdo 01</a></li>
            <li><a href="#dois">ir para conteúdo 02</a></li>
        </ul>
        <img src="11209moto2.jpg" alt="" />
    </div>
    <div id="quatro">
        <h1>Conteudo 04</h1>
        <ul>
            <li><a href="#um">ir para conteúdo 01</a></li>
            <li><a href="#dois">ir para conteúdo 02</a></li>
            <li><a href="#tres">ir para conteúdo 03</a></li>
        </ul>
        <img src="4268moto1-1.jpg" alt="" />
    </div>
</div>

CSS:

html, body {
margin:0;
font:12px Arial, Helvetica, sans-serif;
}
#container {
width:95%;
margin:0 auto;
}
h1 {
display:block;
width:60%;
position:relative;
float:left;
}
#um, #dois, #tres, #quatro{
padding:10px;
width:95%;
text-align:center;
}
ul {
width:40%;
margin:0;
padding:20px 0 10px;
position:relative;
list-style:none;
float:left;
}
ul li {
position:relative;
float:left;
}
ul li a {
display:block;
padding:4px 8px;
color:#063;
text-decoration:none;
}

Temos a estrutura básica com todos os links apontados para os seus devidos lugares. Porém ao clicar a página é deslocada de forma brusca e nada atrativa.

Eis o momento em que damos vida a nossa página adicionando a biblioteca JQuery disponível no site http://jquery.com/

$(function(){
 
//Rolagem de página
//Definindo a ação - No caso indico que ao clicar em qualquer <strong>tag A</strong> desencadeia a seguinte ação
$("a").click(function(){
//animar, a partir do html/body, a rolagem
$('html,body').animate({scrollTop:
 
//até a posição obtida pela altura do <strong>elemento alvo</strong> a ser especificado
$("elemento alvo").offset().top}
 
//velocidade da animação em milisegundos
, 500);
 
//atribui para este caso, que retornasse na como <strong>elemento alvo</strong> o <strong>href</strong> do objeto clicado
$(this).attr("href")
 
A função completa ficou assim:
$(function(){
 
//Rolagem de página
$("a").click(function(){
$('html,body').animate({scrollTop: $($(this).attr("href")).offset().top}, 500);
})
})
})
})

Jquery – Introdução a biblioteca Javascript

Posted by Gabriel Verta | Posted in Geral | Posted on 04-11-2009-05-2008

0

Apesar de já ter postado aqui sobre jQuery, trago este post do blog da Stiod para aqueles que ainda não viram.

Introdução
JQuery é uma biblioteca Javascript que tem como objetivo simplificar o tratamento javascript em uma página HTML, ou seja, tornar mais fácil o tratamento de eventos, animações, requisições Ajax… Muito utilizada no mercado devido a facilidade de uso e de extensão, onde os diversos programadores que a utilizam criam plugins para as mais variadas atividades, tais como slide de imagens, máscara para campos de formulário, tornar bordas redondas dentre outras…

Como funciona?
Para utilizar a biblioteca basta adicionar o arquivo Javascript do jQuery:

<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
 
<script type="text/javascript">
 
</script>
</head>
<body>
<a href="http://jquery.com/">jQuery</a>
</body>
</html>

A última versão também pode ser encontrada em http://code.jquery.com/jquery-latest.js

Exemplo de utilização
Caso eu queira que todos os elementos que tenham a classe “dinamico” sejem ocultadas quando apertado o botão ocultar, eu teria o seguinte código dentro da função de ocultar:

$('.dinamico').hide()

ou ainda, utilizando os efeitos do jQuery:

$('.dinamico').fadeOut("slow")

Veja este exemplo funcionando:

No próximo post explicarei algumas funcionalidades do objeto jQuery e como funcionam os seletores.