none
Alterar texto de um label dentro do datalist RRS feed

  • Pergunta

  • Olá,

    Tenho um label dentro de um datalist e gostaria de saber como posso setar um valor no Text desse meu label via código?

    Obrigado,

    sexta-feira, 23 de março de 2012 14:10

Respostas

  • Segue o exemplo.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DataList.aspx.cs" Inherits="WebApplication1.DataList" %>
    
    <!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></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:DataList ID="dtListCores" runat="server" 
                onitemdatabound="dtListCores_ItemDataBound">
                <HeaderTemplate>
                    Cores
                </HeaderTemplate>
                <ItemTemplate>
                <asp:Label runat="server" ID="lblCor"/>
                </ItemTemplate>
            </asp:DataList>
        </div>
        </form>
    </body>
    </html>
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
        public partial class DataList : System.Web.UI.Page
        {
            private int count = 1;
            protected void Page_Load(object sender, EventArgs e)
            {          
    
                if (!IsPostBack)
                {
                    List<string> cores = new List<string>();
                    cores.Add("verde");
                    cores.Add("azul");
                    cores.Add("amarelo");
                    cores.Add("vermelho");
    
                    dtListCores.DataSource = cores;
                    dtListCores.DataBind();
                }
            }
    
            protected void dtListCores_ItemDataBound(object sender, DataListItemEventArgs e)
            {
                
                if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {               
                    Label lbl = (Label)e.Item.FindControl("lblCor");                
                    string cor = e.Item.DataItem.ToString();
                    lbl.Text = string.Format("{0}. {1}", count, cor);
                    count++;
                }
            }
        }
    }

    Resultado:


    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta Diogo_Costa segunda-feira, 26 de março de 2012 19:31
    sexta-feira, 23 de março de 2012 14:29
  • Oi Diego, claro que é possível.

    Como Eu não sei o que você está fazendo extamente Eu alterei o exemplo.

    1 carrego o dataList. Depois você pode entrar com o nome de uma cor existente no datalist e deve clicar em "alterar". Se existir eu altero o Label. Espero que lhe ajude.

    abraço

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataList.aspx.cs" Inherits="DataList" %>
    
    <!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></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:DataList ID="dtListCores" runat="server" Height="32px" Width="124px">
                <HeaderTemplate>
                    Cores
                </HeaderTemplate>
                <ItemTemplate>
                <asp:Label runat="server" ID="lblCor"/>
                </ItemTemplate>
            </asp:DataList>
        </div>
        <br />
        <br />
        Nome da cor:
        <br />
        <br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <br />
        <asp:Button ID="btnAlterarLabel" runat="server" Text="Alterar label" />
        </form>
    </body>
    </html>
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class DataList : System.Web.UI.Page
    {    
    
        protected void Page_Load(object sender, EventArgs e)
        {
            //handler que executa o Click do botão Alterar Label.
            //Pode setar diretamente no evento click do html... é o mais comum.
            btnAlterarLabel.Click += btnAlterarLabel_Click;
    
            if (!IsPostBack)
            {
                //Utilizado apenas para setar o Text do Label em tempo de execução. Pode ser configurado diretamente
                //no aspx.
                 dtListCores.ItemDataBound += dtListCores_ItemDataBound;  
               
                //bind do dataList
                 CarregarDataList();          
            }
        }
    
        protected void dtListCores_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Label lbl = (Label)e.Item.FindControl("lblCor");
                string cor = e.Item.DataItem.ToString();
                lbl.Text = e.Item.DataItem.ToString();     
            }
        }
     
        protected void btnAlterarLabel_Click(object sender, EventArgs e)
        {
            string busca = TextBox1.Text;
    
            foreach (DataListItem _item in dtListCores.Items)
            {
                if (_item.ItemType == ListItemType.Item || _item.ItemType == ListItemType.AlternatingItem)
                {
                    Label lbl = (Label)_item.FindControl("lblCor");               
    
                    //se o Text for igual ao digitado no TextBox, alterar o Text do Label
                    //veja que utilizo .ToUpper para não ter problemas entre letras minuscula/maiuscula
                    if(lbl.Text.ToUpper().Equals(busca.ToUpper()))
                    {
                        lbl.Text = string.Format(">>> {0} <<<", lbl.Text);
                    }
                }
            }
        }
    
        void CarregarDataList()
        {
            List<string> cores = new List<string>();
            cores.Add("verde");
            cores.Add("azul");
            cores.Add("amarelo");
            cores.Add("vermelho");
    
            dtListCores.DataSource = cores;
            dtListCores.DataBind();
        }
    }



    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Sugerido como Resposta rs.developer sábado, 24 de março de 2012 16:38
    • Marcado como Resposta Diogo_Costa segunda-feira, 26 de março de 2012 19:31
    sábado, 24 de março de 2012 15:32

Todas as Respostas

  • Bom dia Diogo.

    Você tem que percorrer o DataList (ItemDataBound) e encontrar o Label com um FindControl. Após isto basta manipular o mesmo. Vou fazer um exemplo e posto já.


    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    sexta-feira, 23 de março de 2012 14:15
  • Segue o exemplo.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DataList.aspx.cs" Inherits="WebApplication1.DataList" %>
    
    <!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></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:DataList ID="dtListCores" runat="server" 
                onitemdatabound="dtListCores_ItemDataBound">
                <HeaderTemplate>
                    Cores
                </HeaderTemplate>
                <ItemTemplate>
                <asp:Label runat="server" ID="lblCor"/>
                </ItemTemplate>
            </asp:DataList>
        </div>
        </form>
    </body>
    </html>
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
        public partial class DataList : System.Web.UI.Page
        {
            private int count = 1;
            protected void Page_Load(object sender, EventArgs e)
            {          
    
                if (!IsPostBack)
                {
                    List<string> cores = new List<string>();
                    cores.Add("verde");
                    cores.Add("azul");
                    cores.Add("amarelo");
                    cores.Add("vermelho");
    
                    dtListCores.DataSource = cores;
                    dtListCores.DataBind();
                }
            }
    
            protected void dtListCores_ItemDataBound(object sender, DataListItemEventArgs e)
            {
                
                if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {               
                    Label lbl = (Label)e.Item.FindControl("lblCor");                
                    string cor = e.Item.DataItem.ToString();
                    lbl.Text = string.Format("{0}. {1}", count, cor);
                    count++;
                }
            }
        }
    }

    Resultado:


    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Marcado como Resposta Diogo_Costa segunda-feira, 26 de março de 2012 19:31
    sexta-feira, 23 de março de 2012 14:29
  • E ae Paulo,

    Me perdoa, mas esqueci de dizer que eu queria setar um valor pro label pelo evento do button. Isso é possível?

    Muito obrigado pela resposta. Testei o seu exemplo e funciona perfeitamente, mas eu tenho essa particularidade. =/

    Mais alguma sugestão?

    Obrigado

    sábado, 24 de março de 2012 03:55
  • Oi Diego, claro que é possível.

    Como Eu não sei o que você está fazendo extamente Eu alterei o exemplo.

    1 carrego o dataList. Depois você pode entrar com o nome de uma cor existente no datalist e deve clicar em "alterar". Se existir eu altero o Label. Espero que lhe ajude.

    abraço

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataList.aspx.cs" Inherits="DataList" %>
    
    <!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></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:DataList ID="dtListCores" runat="server" Height="32px" Width="124px">
                <HeaderTemplate>
                    Cores
                </HeaderTemplate>
                <ItemTemplate>
                <asp:Label runat="server" ID="lblCor"/>
                </ItemTemplate>
            </asp:DataList>
        </div>
        <br />
        <br />
        Nome da cor:
        <br />
        <br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <br />
        <asp:Button ID="btnAlterarLabel" runat="server" Text="Alterar label" />
        </form>
    </body>
    </html>
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class DataList : System.Web.UI.Page
    {    
    
        protected void Page_Load(object sender, EventArgs e)
        {
            //handler que executa o Click do botão Alterar Label.
            //Pode setar diretamente no evento click do html... é o mais comum.
            btnAlterarLabel.Click += btnAlterarLabel_Click;
    
            if (!IsPostBack)
            {
                //Utilizado apenas para setar o Text do Label em tempo de execução. Pode ser configurado diretamente
                //no aspx.
                 dtListCores.ItemDataBound += dtListCores_ItemDataBound;  
               
                //bind do dataList
                 CarregarDataList();          
            }
        }
    
        protected void dtListCores_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Label lbl = (Label)e.Item.FindControl("lblCor");
                string cor = e.Item.DataItem.ToString();
                lbl.Text = e.Item.DataItem.ToString();     
            }
        }
     
        protected void btnAlterarLabel_Click(object sender, EventArgs e)
        {
            string busca = TextBox1.Text;
    
            foreach (DataListItem _item in dtListCores.Items)
            {
                if (_item.ItemType == ListItemType.Item || _item.ItemType == ListItemType.AlternatingItem)
                {
                    Label lbl = (Label)_item.FindControl("lblCor");               
    
                    //se o Text for igual ao digitado no TextBox, alterar o Text do Label
                    //veja que utilizo .ToUpper para não ter problemas entre letras minuscula/maiuscula
                    if(lbl.Text.ToUpper().Equals(busca.ToUpper()))
                    {
                        lbl.Text = string.Format(">>> {0} <<<", lbl.Text);
                    }
                }
            }
        }
    
        void CarregarDataList()
        {
            List<string> cores = new List<string>();
            cores.Add("verde");
            cores.Add("azul");
            cores.Add("amarelo");
            cores.Add("vermelho");
    
            dtListCores.DataSource = cores;
            dtListCores.DataBind();
        }
    }



    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    • Sugerido como Resposta rs.developer sábado, 24 de março de 2012 16:38
    • Marcado como Resposta Diogo_Costa segunda-feira, 26 de março de 2012 19:31
    sábado, 24 de março de 2012 15:32
  • Fala Paulo,

    Excelente! 

    Porém, não tive o resultado que eu estava esperando. 

    O que eu estou tentando fazer é um sistema de comentários, onde estou exibindo os comentários pelo datalist. Eu estou querendo que quando o usuario cadastra-se um comentário aparecesse uma mensagem nele dizendo que o comentário passaria por uma moderação ou algo do tipo. Então pensei em usar o label.

    protected void btnAlterarLabel_Click(object sender, EventArgs e)
        {
            string busca = TextBox1.Text;
    
            foreach (DataListItem _item in dtListCores.Items)
            {
                if (_item.ItemType == ListItemType.Item || _item.ItemType == ListItemType.AlternatingItem)
                {
                    Label lbl = (Label)_item.FindControl("lblCor");               
    
                    //se o Text for igual ao digitado no TextBox, alterar o Text do Label
                    //veja que utilizo .ToUpper para não ter problemas entre letras minuscula/maiuscula
                    if(lbl.Text.ToUpper().Equals(busca.ToUpper()))
                    {
                        lbl.Text = string.Format(">>> {0} <<<", lbl.Text);
                    }
                }
            }
        }

    Nesse ultimo exemplo que você me passou, ele colocar essa mensagem em todos os registros que o datalist está exibindo e eu queria mostrar só no que a pessoa cadastrou naquela hora. 

    Mais alguma idéia?

    Obrigado

    segunda-feira, 26 de março de 2012 01:25
  • Não não... não coloca em todos os Labels não. Veja que Ele altera o Label apenas onde tem o nome igual o digitado no TextBox. Como Eu disse, não sabia o que você queria. Neste caso O label pode ficar fora do DataList e a cada comentário você apenas exibe a mensagem.

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    segunda-feira, 26 de março de 2012 13:28
  • Acho que eu estou fazendo alguma coisa errada então...

    Aqui é o meu datalist, o lblMensagem é o que eu estou tentando setar o valor.

        <asp:DataList ID="dlComentarios" runat="server" RepeatColumns="1">
            <ItemTemplate>
                <asp:Label ID="lblMensagem" runat="server" ></asp:Label><br /><br />
                <asp:Label ID="lblNome" runat="server" Text='<%# Eval("NOME") %>'></asp:Label><br /><br />
                <asp:Label ID="lblData" runat="server" Text='<%# Eval("DATA") %>'></asp:Label><br /><br />
                <asp:Label ID="lblComentario" runat="server" Text='<%# Eval("COMENTARIO") %>'></asp:Label>
    
                    <div class="tgl">
                       <h2>Conteúdo um</h2>
                       <p>Lorem ipsum dolor sit amet, consectetuer...</p>
                    </div>
            </ItemTemplate>
        </asp:DataList>
    

    Aqui é o método que cadastra os comentários, no final eu estou retornando os comentários para que ele mostre o comentario cadastrado na hora.

                ComentarioBO comentarioBO = new ComentarioBO();
                List<tb_comentarios> lista = comentarioBO.RetornarComentarios().ToList();
    
                dlComentarios.DataSource = lista.Where(p => p.ARTIGO_ID == idMateria);
                dlComentarios.DataBind();
    
                foreach (DataListItem _item in dlComentarios.Items)
                {
                    Label lbl = (Label)_item.FindControl("lblMensagem");
                    lbl.Text = "MEnsagem teste";
                }
    

    Antes de cadastrar(não repare na bagunça, ainda estou acertando as coisas... ;D ): 

    E logo após ter feito o cadastro:

    Repare que apareceu nos 4 comentários que eu tenho cadastrado, não seria por causa do foreach? 

    segunda-feira, 26 de março de 2012 16:25
  • Diego,

    Neste caso sim, altera todos os Label's. Você não concorda que basta ter apenas 1 Label fora do DataList?? Não tem porque ter 1 dentro do dataList...


    Paulo César Viana
    MCC|MCP|MCTS --

    Marque as respostas e contribua para uma melhora no fórum.

    segunda-feira, 26 de março de 2012 16:59
  • "Diogo"... hehe, todo mundo troca por Diego =D

    Então, também pensei nessa possibilidade, mas eu queria mesmo é que aparecesse no corpo do comentários... =/.... 

    Mas vou fazer mesmo do jeito que você sugeriu...

    Muito obrigado pela força Paulo.

    Abraços...

    segunda-feira, 26 de março de 2012 19:30
  • hahaha, desculpas por trocar seu nome. Poxa, se você quiser fazer desta forma é tranquilo de fazer, Eu só penso que não é necessário.

    Abraço.


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    segunda-feira, 26 de março de 2012 21:16