Usuário com melhor resposta
ListBox pegando só o primeiro item

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
Respostas
-
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
Todas as Respostas
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
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/ -
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
-
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/ -
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
-
-
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
-
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