none
Dropdownlist - Itens com mesmo value RRS feed

  • Pergunta

  • <asp:DropDownList runat="server" ID="ddlTamanho">
                <asp:ListItem Value="6">tamanho 1</asp:ListItem>
                <asp:ListItem Value="6">tamanho 2</asp:ListItem>
                <asp:ListItem Value="6">tamanho 3</asp:ListItem>
                <asp:ListItem Value="6">tamanho 4</asp:ListItem>
            </asp:DropDownList>

    Tenho um drop semelhante a este onde tenho tamanhos diferentes com mesmo value (que utilizo como uma informação secundária). Porém, se tenho tamanhos diferenets mas com mesmo value quando tento utilizar o 

    Response.Write("tamanho: " + ddlTamanho.SelectedIndex);

    Pra exibir o item selecionado ele joga sempre no index 0. Se o value é diferente ele funciona normalmente. Mas eu preciso e uma situação do value e em outra do Text do item selecionado. Alguem sabe o que fazer para acabar com esse problema? 

    Obrigado


    Juan Nogueira
    Visite o meu site:
    www.juannogueira.com.br
    Se foi útil, marque como resposta e faça a alegria de um programador :)

    segunda-feira, 13 de agosto de 2012 15:33

Respostas

  • Tucão e se você concatenar o seu Value? Por exemplo?

    <asp:ListItem Value="Tamanho1 - 6">tamanho 1</asp:ListItem>
    <asp:ListItem Value="Tamanho2 - 6">tamanho 2</asp:ListItem>
    <asp:ListItem Value="Tamanho3 - 6">tamanho 3</asp:ListItem>
    <asp:ListItem Value="Tamanho4 - 6">tamanho 4</asp:ListItem>



    Se a resposta foi útil por favor qualifique! Janderson Candido de Mattos - MCTS

    • Marcado como Resposta Juan Nogueira segunda-feira, 13 de agosto de 2012 16:26
    segunda-feira, 13 de agosto de 2012 15:50
  • Então configure seu dt (o que suponho q seja uma DataTable) para inserir uma nova coluna com as colunas tamanho e preço concatenadas. Faça com que sua table fique assim:

    tamanho | preco | tamanhoPreco

    tam1 | 5 | tam1-5

    Tendo essa coluna dinâmica, adicione-a no seu DataValueField.


    Rafael Santos

    Observações:
    1. Selecione a opção "Habilitar o Live Alerts por Padrão" nas suas configurações para que possa acompanhar em tempo real as atividades relacionadas a sua Thread;
    2. Não abandone sua Thread. Ao perguntar, fique atento às respostas; ao encontrar uma solução, compartilhe;
    3. As pessoas que dedicam seu tempo na busca por soluções para você não ganham nada em troca. Valorize-as e em forma de agradecimento pontue as respostas corretas.

    "Quem disse que não escrevo poesias? A diferença é que as minhas começam com using System;"

    • Marcado como Resposta Juan Nogueira segunda-feira, 13 de agosto de 2012 16:25
    segunda-feira, 13 de agosto de 2012 16:09
  • Juan apenas complementando as sugestões do pessoal acima, caso você venha a adotar a solução aonde ira concatenar os valores do seu DataTable, você pode adicionar uma coluna e atribuir uma expression para ele, vamos supor que o nome do DropDownList é ddlPrecos, veja:

    //Simulando retorno do banco de dados
    DataTable dt = new DataTable();
    
    //Colunas que ja existe no seu DataTable
    dt.Columns.Add(new DataColumn("preco", typeof(string)));
    dt.Columns.Add(new DataColumn("tamanho", typeof(string)));
    
    //Sua nova coluna combinando preco + tamanho
    dt.Columns.Add(new DataColumn("combinado", typeof(string), "preco +' '+ tamanho"));
    
    //Valores Fake
    dt.Rows.Add("10.50", "G");
    dt.Rows.Add("78.30", "GG");
    dt.Rows.Add("13.50", "P");
    
    //Atribuindo ao DropDownList
    ddlPrecos.DataSource = dt;
    ddlPrecos.DataTextField = "tamanho";
    ddlPrecos.DataValueField = "combinado";
    ddlPrecos.DataBind();

    Resultado após renderizado:

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    • Marcado como Resposta Juan Nogueira segunda-feira, 13 de agosto de 2012 16:29
    • Editado Vitor Mendes segunda-feira, 13 de agosto de 2012 16:30
    segunda-feira, 13 de agosto de 2012 16:28

Todas as Respostas

  • Juan,

    Você esta mandando escrever o indice, logo se você não especificar qual o indice que você esta selecionando, o defaut é 0(zero) assim o ideal ou você setar o indice para Ex: selectedindex = 2 e em seguida para escrever o tamando usar

    ddlTamanho.Selectedindex = 2;

    Response.Write("tamanho: " + ddlTamanho.text) ou 
    Response.Write("tamanho: " + ddlTamanho.Selectedvalue)


    é sempre bom aprender um pouco mais. - www.tanabiblia.com.br



    segunda-feira, 13 de agosto de 2012 15:46
  • Tucão e se você concatenar o seu Value? Por exemplo?

    <asp:ListItem Value="Tamanho1 - 6">tamanho 1</asp:ListItem>
    <asp:ListItem Value="Tamanho2 - 6">tamanho 2</asp:ListItem>
    <asp:ListItem Value="Tamanho3 - 6">tamanho 3</asp:ListItem>
    <asp:ListItem Value="Tamanho4 - 6">tamanho 4</asp:ListItem>



    Se a resposta foi útil por favor qualifique! Janderson Candido de Mattos - MCTS

    • Marcado como Resposta Juan Nogueira segunda-feira, 13 de agosto de 2012 16:26
    segunda-feira, 13 de agosto de 2012 15:50
  • Utilizei o index como exemplo, na verdade as informações que eu pego são: value e text do item selecionado. No caso quando tenho todos os itens com o mesmo values ele da conflito no item selecionado. Se todos os itens tem o mesmo value independente de qual eu seleciono, ele sempre seleciono ele pega sempre o value e text do primeiro.


    Juan Nogueira
    Visite o meu site:
    www.juannogueira.com.br
    Se foi útil, marque como resposta e faça a alegria de um programador :)

    segunda-feira, 13 de agosto de 2012 15:50
  • Eu pensei nisso! Só que nessa eu cai em outro probleminha.

    Por exemplo, no caso real eu preencho  o drop com informações do banco, da seguinte maneira:

    ddlTamanhoPreco.DataSource = dt;
            ddlTamanhoPreco.DataTextField = "tamanho";
            ddlTamanhoPreco.DataValueField = "preco";
            ddlTamanhoPreco.DataBind();

    Só que dessa maneira eu não sei como atribuir um value concatenado.


    Juan Nogueira
    Visite o meu site:
    www.juannogueira.com.br
    Se foi útil, marque como resposta e faça a alegria de um programador :)

    segunda-feira, 13 de agosto de 2012 15:53
  • Então configure seu dt (o que suponho q seja uma DataTable) para inserir uma nova coluna com as colunas tamanho e preço concatenadas. Faça com que sua table fique assim:

    tamanho | preco | tamanhoPreco

    tam1 | 5 | tam1-5

    Tendo essa coluna dinâmica, adicione-a no seu DataValueField.


    Rafael Santos

    Observações:
    1. Selecione a opção "Habilitar o Live Alerts por Padrão" nas suas configurações para que possa acompanhar em tempo real as atividades relacionadas a sua Thread;
    2. Não abandone sua Thread. Ao perguntar, fique atento às respostas; ao encontrar uma solução, compartilhe;
    3. As pessoas que dedicam seu tempo na busca por soluções para você não ganham nada em troca. Valorize-as e em forma de agradecimento pontue as respostas corretas.

    "Quem disse que não escrevo poesias? A diferença é que as minhas começam com using System;"

    • Marcado como Resposta Juan Nogueira segunda-feira, 13 de agosto de 2012 16:25
    segunda-feira, 13 de agosto de 2012 16:09
  • Perfeito. Consegui resolver o problema dessa maneira. Obrigado as duas respostas que me ajudaram.

    Estou utilizando Mysql, pra quem quiser saber como eu fiz a concatenação vai um exemplo:

    SELECT CONCAT(Tamanho, '-', CONVERT(preco,CHAR)) as tamanho_preco FROM tamanho_produto;

    Obrigado


    Juan Nogueira
    Visite o meu site:
    www.juannogueira.com.br
    Se foi útil, marque como resposta e faça a alegria de um programador :)

    segunda-feira, 13 de agosto de 2012 16:27
  • Juan apenas complementando as sugestões do pessoal acima, caso você venha a adotar a solução aonde ira concatenar os valores do seu DataTable, você pode adicionar uma coluna e atribuir uma expression para ele, vamos supor que o nome do DropDownList é ddlPrecos, veja:

    //Simulando retorno do banco de dados
    DataTable dt = new DataTable();
    
    //Colunas que ja existe no seu DataTable
    dt.Columns.Add(new DataColumn("preco", typeof(string)));
    dt.Columns.Add(new DataColumn("tamanho", typeof(string)));
    
    //Sua nova coluna combinando preco + tamanho
    dt.Columns.Add(new DataColumn("combinado", typeof(string), "preco +' '+ tamanho"));
    
    //Valores Fake
    dt.Rows.Add("10.50", "G");
    dt.Rows.Add("78.30", "GG");
    dt.Rows.Add("13.50", "P");
    
    //Atribuindo ao DropDownList
    ddlPrecos.DataSource = dt;
    ddlPrecos.DataTextField = "tamanho";
    ddlPrecos.DataValueField = "combinado";
    ddlPrecos.DataBind();

    Resultado após renderizado:

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    • Marcado como Resposta Juan Nogueira segunda-feira, 13 de agosto de 2012 16:29
    • Editado Vitor Mendes segunda-feira, 13 de agosto de 2012 16:30
    segunda-feira, 13 de agosto de 2012 16:28
  • Obrigado pela resposta Vitor!

    Agora só uma dúvida. Acabei fazendo a concatenação direto na instrução select. Realizando a concatenação via código ganharia em questão de desempenho? 

    Obrigado


    Juan Nogueira
    Visite o meu site:
    www.juannogueira.com.br
    Se foi útil, marque como resposta e faça a alegria de um programador :)

    segunda-feira, 13 de agosto de 2012 16:31
  • Juan não sei te afirmar, teria que comparar o custo desta operação, o quanto isso pesaria no seu MySQL. Creio que a solução que eu propus não consumiria tanto recurso pelo fato destas informações ja estarem no seu DataTable, imagina que quando esta coluna é invocada (coluna combinada), um macro interno é disparado, pegando esta expressão, executando e retorando os valores devidamente tratado de acordo com a expressão.

    Fica ai um bom tema para se estudar com o tempo Juan
    =D

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    segunda-feira, 13 de agosto de 2012 16:37
  • Acredito que a nível de aplicação, fazendo na query - e de preferencia diretamente no banco através de procedure - você ganha em desempenho, pois exime-se de criar métodos manipulação no DataTable.

    Rafael Santos

    Observações:
    1. Selecione a opção "Habilitar o Live Alerts por Padrão" nas suas configurações para que possa acompanhar em tempo real as atividades relacionadas a sua Thread;
    2. Não abandone sua Thread. Ao perguntar, fique atento às respostas; ao encontrar uma solução, compartilhe;
    3. As pessoas que dedicam seu tempo na busca por soluções para você não ganham nada em troca. Valorize-as e em forma de agradecimento pontue as respostas corretas.

    "Quem disse que não escrevo poesias? A diferença é que as minhas começam com using System;"

    segunda-feira, 13 de agosto de 2012 17:14