none
ListBox pegando só o primeiro item RRS feed

  • Pergunta

  • Olá pessoal...

    Estou com um problema aparentemente simples.

    Tenho dois ListBox e passo os itens selecionados do primeiro para o segundo, mas não importa quais itens seleciono ele só passa o primeiro item veja:

    foreach (ListItem item in list1.Items)
            {
                if (item.Selected)                         
                        list2.Items.Add(new ListItem(item.Text, item.Value));            

    }


    Alexander

    segunda-feira, 25 de junho de 2012 14:20

Respostas

Todas as Respostas

  • Alexandre esse procedimento será que não esta dentro do load da página se estiver coloque isso

    ! is.page.postback


    Junior

    segunda-feira, 25 de junho de 2012 14:23
  • Junior... Este procedimento está dentro de um Button que está dentro de um UpdatePanel.

    Alexander

    segunda-feira, 25 de junho de 2012 14:35
  • Alexandre vc debugou e viu se ele entrou no if ? se entrou vc verificou se o item selecionado é diferente do primeiro item do listbox ?

    Junior

    segunda-feira, 25 de junho de 2012 14:40
  • Junior, não importa o item que seleciono, no código(em debug) ele só pega o primeiro.

    Alexander

    segunda-feira, 25 de junho de 2012 14:46
  • o bind desse seu listbox não esta no load da página ?


    Junior

    segunda-feira, 25 de junho de 2012 14:53
  • Esta sim, dentro de if(!IsPostBack), mas quando o foreach percorre o ListBox ele já esta carregado.

    Alexander

    segunda-feira, 25 de junho de 2012 15:06
  • Alexandre faz assim

    if (!Page.IsPostBack)

    {

        carrega teu listbox

    }

    string selecteditem = ListBox1.SelectedItem.Text;

    e verifica o valor


    Junior

    segunda-feira, 25 de junho de 2012 15:23
  • Junior estou carregando este listbox dentro do if(!ispostback) no Page_Load da página, dei um breakpoint na função que carrega o listbox

     e não entra lá por que está dentro do !ispostback, mas quando clico no botão que adiciona os item deste listbox para outro ele se comporta como se estivesse dado refresh na pagina e volta o indice do listbox para o primeiro da lista, só que esses componentes estão dentro de um updatepanel.


    Alexander

    segunda-feira, 25 de junho de 2012 15:40
  • tira ele de dentro do updatepanel para ver

    Junior

    segunda-feira, 25 de junho de 2012 16:41
  • Alexandre vc já tentou isso

    string teste = listbox1.SelectedItem.Value.ToString();


    Junior

    segunda-feira, 25 de junho de 2012 17:15
  • Já fiz isso. Estive observando que qualquer botão da tela faz com que o listbox perca o foco e volta pro índice -1, parece que o listbox sofre um refresh, mas é estranho pq ele está dentro do update panel.

    Alexander

    segunda-feira, 25 de junho de 2012 18:45
  • e qdp vc tirou ele de dentro do updatepanel resolveu ?

    Junior

    segunda-feira, 25 de junho de 2012 19:01
  • Não, já criei uma pagina nova somente com dois listbox e acontece a mesma coisa.

    Alexander

    segunda-feira, 25 de junho de 2012 19:16
  • posta ai teu codigo

    Junior

    segunda-feira, 25 de junho de 2012 19:19
  • Alexander fiz aqui um exemplo, veja se te ajuda:

    .aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
    
    <!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 id="Head1" runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <table border="0" cellpadding="0" cellspacing="0">
                <tr>
                    <td>
                        <asp:ListBox runat="server" ID="lstbDisciplinas" SelectionMode="Multiple" Width="70px">
                        </asp:ListBox>
                    </td>
                    <td>
                        <asp:Button Text="<" OnClick="InserirRemover_Disciplina" CommandArgument="Remover"
                            runat="server" />
                        <br />
                        <asp:Button ID="Button1" Text=">" OnClick="InserirRemover_Disciplina" CommandArgument="Inserir"
                            runat="server" />
                    </td>
                    <td>
                        <asp:ListBox runat="server" ID="lstbDisciplinasEscolhidas" SelectionMode="Multiple"
                            Width="70px"></asp:ListBox>
                    </td>
                </tr>
            </table>
        </div>
        </form>
    </body>
    </html>
    

    .cs

    using System;
    using System.Data;
    using System.Linq;
    using System.Collections.Generic;
    using System.Web.UI.WebControls;
    using System.Web.Services;
    using System.Web.Script.Services;
    
    namespace WebApplication1
    {
        public partial class WebForm1 : System.Web.UI.Page
        {
            public string Status { get; set; }
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    //Inserindo disciplinas
                    lstbDisciplinas.Items.Add(new ListItem { Text = "Matematica", Value = "1" });
                    lstbDisciplinas.Items.Add(new ListItem { Text = "Historia", Value = "2" });
                    lstbDisciplinas.Items.Add(new ListItem { Text = "Inglês", Value = "3" });
                }
            }
    
            protected void InserirRemover_Disciplina(object sender, EventArgs e)
            {
                List<ListItem> items = new List<ListItem>();
    
                switch (((Button)sender).CommandArgument)
                {
                    case "Inserir":
                        items = lstbDisciplinas.Items.Cast<ListItem>().ToList();
    
                        if (!items.Any(f => f.Selected))
                            return;
    
                        //Removendo itens selecionados
                        foreach (var item in items.Where(f => f.Selected))
                        {
                            lstbDisciplinas.Items.Remove(item);
                        }
    
                        //Adicionando items selecionados
                        foreach (var item in items.Where(f => f.Selected))
                        {
                            lstbDisciplinasEscolhidas.Items.Add(item);
                        }
                        break;
    
                    case "Remover":
                        items = lstbDisciplinasEscolhidas.Items.Cast<ListItem>().ToList();
    
                        if (!lstbDisciplinasEscolhidas.Items.Cast<ListItem>().Any(f => f.Selected))
                            return;
    
                        //Removendo itens selecionados
                        foreach (var item in items.Where(f => f.Selected))
                        {
                            lstbDisciplinasEscolhidas.Items.Remove(item);
                        }
    
                        //Adicionando items selecionados
                        foreach (var item in items.Where(f => f.Selected))
                        {
                            lstbDisciplinas.Items.Add(item);
                        }
                        break;
                }
            }
        }
    }


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

    segunda-feira, 25 de junho de 2012 19:25
  • Pessoal depois de alguns teste percebi que se eu carregar o listbox da maneira a baixo, não vai funcionar:

        ltbAgenteSelect.DataSource = tabela;
                ltbAgenteSelect.DataTextField = "Nome";
                ltbAgenteSelect.DataValueField = "ID";
                ltbAgenteSelect.DataBind();

    mas se eu colocar assim como abaixo funciona:

               ltbAgenteSelect.Items.Add(new ListItem { Text = "Matematica", Value = "1" });
                ltbAgenteSelect.Items.Add(new ListItem { Text = "Historia", Value = "2" });
                ltbAgenteSelect.Items.Add(new ListItem { Text = "Inglês", Value = "3" });

    Como meus dados vem do banco fiz um foreach na tabela, mas também não funcionou:

       foreach (DataRow item in dtage.Rows)
                {
                    ltbAgenteSelect.Items.Add(new ListItem { Text = item["nome"].ToString(), Value = item["idrisco"].ToString() });

                }

    SÓ ESTÁ FUNCIONANDO SE EU POR MANUAL ASSIM:

    ltbAgenteSelect.Items.Add(new ListItem { Text = "Inglês", Value = "3" });

    Alguma ideia de como carregar isso num for ou foreach?


    Alexander

    segunda-feira, 25 de junho de 2012 20:27
  • Alexander muito estranho, não vejo um potencial erro descrito no teu cenário. O seus ListBox não estão disparando algum evento do tipo SelectedIndexChanged ou TextChanged ?

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

    segunda-feira, 25 de junho de 2012 21:29
  • Pois é Vitor coloquei em uma página nova um listbox novo sem nenhum evento e veja que estranho:

    Assim funciona:

        for (int i = 0; i <= 28; i++)
                {
                    ltbAgenteSelect.Items.Add(new ListItem { Text = i + "OUTRAS SITUAÇÕES DE RISCO", Value = i.ToString() });
                }

    Mas quando busco do banco, ai ele se comporta estranho, não funciona:

               for (int i = 0; i <= dtage.Rows.Count; i++)
               {
                   ltbAgenteSelect.Items.Add(new ListItem { Text = dtage.Rows[i]["Nome"].ToString(), Value = dtage.Rows[i]["idrisco"].ToString() });
               }    

    Lembrando  que ambas as formas carregam o listbox, mas da segunda forma não deixa passar pro segundo listbox.


    Alexander

    terça-feira, 26 de junho de 2012 11:24
  • Alexandre pq vc n faz assim é muito mais fácil

    ltbAgenteSelect.datasource = dtage;

    ltbAgenteSelect.databind();


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    terça-feira, 26 de junho de 2012 11:44
    Moderador
  • Então Seilor... desta maneira foi a primeira que tentei(é padrão), mas como não deu certo parti para essas outras alternativas. O problema é a maneira de carregar, se carrego pelo banco na hora de passar os itens para o outro listbox ele para o foco sempre na primeira linha como se tivesse dado um refresh, mas se carrego manual como no post acima ele respeita normalmente. (que estranho não!!!!)

    Alexander

    terça-feira, 26 de junho de 2012 12:07
  • Pessoal... Obrigado a todos que ajudaram. Achei a solução neste post

    http://social.msdn.microsoft.com/Forums/pt-br/aspnetpt/thread/b3ea0725-858f-4af9-b7f4-84b25bac66a6

    O problema era que na hora de carregar o lisbox o datatextField estava correto, mas o datavalueField estava carregando sempre o mesmo valor.

    Corrigi isso e funcionou. Obrigado.


    Alexander

    • Marcado como Resposta Alexander Leão terça-feira, 26 de junho de 2012 15:40
    terça-feira, 26 de junho de 2012 15:40