Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

asp.net

DataTable com ListBox

Recommended Posts

Bom galera,Estou sem tempo para postar aqui no Blog, espero em breve ter mais tempo para escrever as minhas experiências com o .NETMas vou postar aqui uma dúvida que surgiu e não tenho conseguido resulver. Tenho numa deteminada situação 1 DataTable e 2 ListBox. Este DataTable tem os valores vindos de uma consulta ao banco, e preciso fazer assim:1 - Verificar que valores constantes no meu DataTable estão presentes no ListBox12 - Jogar para o ListBox2 o resultado do item 1, caso existam.3 - Retirar do ListBox 1 os itens que foram transferidos para o ListBox2P.s Fazer os itens ir de um para o outro é tranquilo, o que não consigo é fazer a comparação dos itens no DataTable com os itens do ListBox1, alguém pode me ajudar com esta bronca?

Compartilhar este post


Link para o post
Compartilhar em outros sites

inicialmente temos duas maneiras de se fazer neston...1) você pode fazer dois loops e percorre-los ou 2) você pode fazer um loop em um list e definir uma chave primaria no datatable e pesquisar por esta chave primaria... (no caso de você ter uma quantidade muita extensa de registros esta opção é recomendada para aumento de performance)1) exemplo dos dois loops: Dim achou As Boolean For i As Integer = 0 To Me.lstMessages.Items.Count - 1 achou = False For Each row As DataRow In Me.DsClientes1.Tables(0).Rows If Me.lstMessages.Items(i).ToString = row("ClienteID").ToString Then achou = True Exit For End If Next If achou Then Me.lstMessages.Items(i) &= " - achou heheh" Else Me.lstMessages.Items(i) &= " - naum achou" End If Next2) exemplo com find: Dim foundrow As DataRow For i As Integer = 0 To Me.lstMessages.Items.Count - 1 foundrow = Me.DsClientes1.Tables(0).Rows.Find(Me.lstMessages.Items(i).ToString) If foundrow Is Nothing Then Me.lstMessages.Items(i) &= " - naum achou" Else Me.lstMessages.Items(i) &= " - achou heheh" End If Nextpara definir chave primaria: Dim keys(0) As DataColumn keys(0) = Me.DsClientes1.Tables(0).Columns("ClienteID") keys(0).Unique = True Me.DsClientes1.Tables(0).PrimaryKey = keysfalows, abs,t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que não seria melhor eu setar o DataSource do meu listbox2 para esta DataTable que estou retornando? Assim ficaria faltando apenas como retirar os itens do listbox1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode crer, tb. pode ser... qq. coisa se você precisar pode fazer uma cópia do datatableé isso ae, por isso que existem 1000 maneiras de se fazer neston....falows,bom final de semana t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas e no caso como posso compara os valores do DataTable com os itens do meu ListBox?

O que são os "itens" do seu ListBox? Com a possibilidade de se colocar objetos dentro da ListBox faz-se necessário especificar isso. E, também seria interessante, especificar o que está na seu DataTable.Abraços,Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

No primeiro post eu disse, mas vamos lá.Meu DataTable é o resultado de um Select no banco, guardando o campo ID do registro no banco. Já no listbox tenho também preenchido com o resultado do banco, guardando os valores ID e nome do cliente. A diferença é que no DataTable tenho apenas os clientes que forão previamente selecionados numa outra página. e no listBox, tenho todos os indices do banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No primeiro post eu disse, mas vamos lá.Meu DataTable é o resultado de um Select no banco, guardando o campo ID do registro no banco. Já no listbox tenho também preenchido com o resultado do banco, guardando os valores ID e nome do cliente. A diferença é que no DataTable tenho apenas os clientes que forão previamente selecionados numa outra página. e no listBox, tenho todos os indices do banco.

Ah, então você pode fazer assim:
Dim linha As DataRow		Dim item As ListItem		For Each linha In dt.Rows			For Each item In ListBox1.Items				If linha("Código") = item.Value Then					item.Selected = True				End If			Next		Next
Onde "dt" é a sua DataTable, "ListBox1" sua ListBox. E, troque também o nome do campo (que no caso ali é "Código") pelo campo da tabela que corresponde ao valor do item da listbox.Abraços,Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza, consegui.

 

Agora e para que usando este resultado eu possa excluir os items deste mesmo listbox?

 

Estou fazendo assim:

 

for each linhas in dt_clientes.rows

For each elemento in lb_clientes.Items

if linhas(1) = elemento.value then

elemento.Selected = true

lb_clientes.Items.Remove(lb_clientes.SelectedItem)

end if

next

next

 

Só que estou recebendo como erro a mensagem abaixo

 

Server Error in '/portobelo' Application.

--------------------------------------------------------------------------------

 

Collection was modified; enumeration operation may not execute.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

 

Exception Details: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.

 

Source Error:

 

 

Line 636: 'lb_clientes.Items.Remove(lb_clientes.SelectedItem)

Line 637: end if

Line 638: next

Line 639: next

Line 640:

 

 

Source File: D:\sistemas\porto_belo\centroprocesso.ascx Line: 638

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, você não pode remover itens de uma coleção dentro de uma iteração, já que perde-se a enumeração original. O que você poderia fazer ali é um while para remover os itens até que não haja nenhum item selecionado (ou seja, até que o loop percorra a lista e chegue no final sem que haja algum selecionado).Certo? ;) Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi fazendo assim, depois do comando de deleção, mando sair do loppinglb_clientes.Items.Remove(lb_clientes.SelectedItem)exit for

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.