Ir para conteúdo

Arquivado

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

MarKteus

List<T> sobrescrevendo

Recommended Posts

Oi gente

 

To com probleminha chato q talvez vc´s possam me ajudar, criei um datareader e ele é preenchido com 3 registros apenas. Aí faço a leitura dele com o já costumeiro while(drDados.Read()) e jogo os registros para um objeto List<T> + ou - assim

 

while (drDados.Read())
{
camposLogE.ID1 = Convert.ToInt32(drDados[0]);
camposLogE.DATALOGENT1 = Convert.ToDateTime(drDados[1]);
lstCampos.Add(camposLogE);
}
return lstCampos;
depois exibo o resultado em um GridView
O problema é que sempre q o laço executa novamente ele preenche no lstCampos com o últimos dados lidos apagando o anterior ou seja, vai para o GridView 3 registros iguais
Alguém sabe o por que que isso está acontecendo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. Por exemplo

 

Se a query retorna 3 linhas, laço se repete 3 vezes, porém só a última linha recuperada no laço é que é adicionado na lista com o .Add. Ao debugar vi que o retorno do banco está correto, ou seja, o dataReader vem com todos os registros, um diferente do outro conforme a tabela, o problema está mesmo no momento em que é adicionado ao List<T>.

Inclusive é criado uma lista com 3 linhas, porém todas as linhas preenchidas com o último registro do dataReader, ou seja, 3 registros repetidos.

No momento da adição com .Add, percebi debugando que, é adicionado o primeiro registro, na segunda passada do laço é colocado o segundo registro em cima do 1º e depois adicionado ao final. O mesmo acontece com o 3º, é colocado sobre o 1º e o sobre 2º e adicionado (ele mesmo) no final.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque você não está passando nenhum parâmetro de ID para a lista.

 

Por padrão, toda a lista do formato List<T> é uma List<int> que pega valores no formato <int,val>, ou seja, ID e valor. você pode tentar fazer o seguinte:

 

Faça um array com os registros e depois utilize o método AddRange da List para adicionar o array, você pode também buscar por ID's como neste exemplo: http://stackoverflow.com/questions/5613192/c-sharp-fill-generic-list-from-sqldatareader

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valew Kaos

 

O que você me sugeriu, pelo que vi deve dar certo também, mas consegui resolver.

Foi digamos, falta de prática no trato com C#. veja:

drLog = dadosTbl.GeraLista(10);
List<CAMPOS_SET_GET> lstCamposLogR = new List<CAMPOS_SET_GET>();
while (drLog.Read())
{
CAMPOS_SET_GET camposLogR = new CAMPOS_SET_GET();
camposLogR.ID = Convert.ToInt32(drLog[11]);
camposLogR.IDENTRADA = Convert.ToInt32(drLog[12]);
camposLogR.DATARETORNO = Convert.ToDateTime(drLog[13]);
lstCamposLogR.Add(camposLogR);
}
return lstCamposLogR;
A primeira linha do While tinha ficado de fora, por isso dava aquele "erro" passei a linha para dentro do laço acabou o problema.
Obrigado mesmo assim :graduated:

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.