NAVEGAR POR ITEMS DA LIST<>

PERCIFILHO 18/03/2016 10:52:56
#459425
Bom amigos, nos meus formulários de cadastro, costumo colocar os botões de navegação (First, Previous, Next e Last).
Daí quando carregava, preenchia um DataTable e pegava o último item do DataTable, e jogava os valores nos campos correspondentes.
Depois quando navegava, ficava fácil navegar entre os registros do DataTable.
Agora eu queria fazer isso com a List<> ao invés de usar o DataTable.
Alguém poderia me dar alguma ajuda nesse sentido? Sei que tem como adicionar e até remover um item na List<>, mas consigo fazer um Update?
Como faria para navegar entre os items quando clicasse nos botões Previous e Next?
Enfim qualquer luz que me guie.
FFCOUTO 18/03/2016 11:26:41
#459426
Resposta escolhida
PERFILHO, a lógica é bem simples. Ao carregar o seu Form e se a lista contiver itens você estará no índice 0. Daí você adiciona ou subtrai 1 nos comandos Next e Previous, podendo até usar First e Last. Para atualizar basta referenciar o índice do item da lista normalmente.

int pos = -1;    // indica que não há itens na lista


no Load do Form você verifica se a sua lista contém itens.

if (minhalista.Count > 0) pos = 0; // seleciona o primeiro item


No comando First basta você setar pos = 0 e exibir os dados
pos = 0;
ExibirDados();


No comando Last a posição será o tamanho da lista -1.
pos = minhalista.Count - 1;
ExibirDados();


No comando Next soma 1;
pos++;
ExibirDados();


No comando Previous subtrai 1;
pos--;
ExibirDados();


Na rotina ExibirDados() basta você selecionar o objeto correspondente ao índice da variável pos.
void ExibirDados()
{
if (pos < 0 || pos >= minhalista.Count) return;
var item = minhalista[pos];
// seus comandos para exibir os dados nos controles
}


Para atualiza o item da lista
var item = minhalista[pos]
item.SuaPropriedade = novoValor;
item.OutraPropriedade = outroValor;


Só tome cuidado, e faça a checagem dos valores nos comandos Next e Previous para não ultrapassar os limites da lista.



PERCIFILHO 18/03/2016 12:31:40
#459432
Valeu, Fabiano, estava fazendo usando essa lógica mas não estava funcionando direito. Agora corrigi uns pontos aqui e funcionou.
Mais uma pergunta: quando eu faço o Insert na List<>, eu apenas levo o ponteiro para o último item e ele me mostra o registro, normal.
Quando eu faço o Update e o Delete, eu preciso criar uma nova lista novamente? é isso mesmo?
Outra coisa:
Quando eu fazia antes, preenchendo o DataTable, na minha tela de consulta, quando dava duplo clique no registro, eu usava assim para mostrar os dados:

DataView view = new DataView();
view.Sort = [Ô]Id[Ô];
posicao = view.Find(txtId.Text);
ObterDados();


E agora, usando o List<> como eu deveria fazer? Tenho que procurar na List<> o índice correspondente ao item cujo código é igual ao TxtId.Text, correto?
Como se faz isso?
PERCIFILHO 18/03/2016 12:49:10
#459433
Olha, no caso da consulta, consegui um exemplo bem legal na Net, que fica assim:

      posicao = lista.Where<Pessoa>(x => x.Id == Convert.ToInt32(txtId.Text)).Select<Pessoa, int>(x => lista.IndexOf(x)).Single<int>();
ObterDados();


Funcionou certinho.

Só falta agora eu saber isso:

Citação:

Quando eu faço o Insert na List<>, eu apenas levo o ponteiro para o último item e ele me mostra o registro, normal.
Quando eu faço o Update e o Delete, eu preciso criar uma nova lista novamente? é isso mesmo?


FFCOUTO 18/03/2016 13:24:30
#459434
Em nenhum caso você precisar criar uma nova lista.

No Insert é isso mesmo que você postou. Apenas mova para o último registro.

No Update basta você atualizar os dados do item atual, que é o item referente ao índice da variável pos. Já citei no exemplo,

No caso do Delete é um pouco mais complexo, pelo fato de você está removendo um item da lista. Para tal, você precisaria verificar os seguintes pontos:
Quando a lista não tiver mais itens: a variável pos vai receber o valor -1;
Quando você remove o último índice da lista: a variável pos vai receber o valor lista.Count -1;
Quando você remove o primeiro índice: a variável pos receber o valor 0, exceto se acontecer o primeiro caso.
Nos demais casos: a posição da lista mantém inalterada, exceto se acontecer o primeiro e segundo casos.
PERCIFILHO 18/03/2016 13:51:24
#459435
Eu disse de criar uma nova lista, porque, por exemplo quando eu deleto um registro, ele até deleta na tabela, mas a lista não é atualizada.
Então eu atualizo a List<> --- > lista = new List<Pessoa>(new Pessoa().GetAll([Ô]id[Ô]));
Aí, sim os registros são mostrados corretamente. No update (edit) também acontece a mesma coisa.

Eis o meu código:

        // botão excluir
private void btnDelete_Click(object sender, EventArgs e)
{
if (MessageBox.Show([Ô]Deseja realmente excluir esse registro?[Ô], [Ô]Confirme[Ô], MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
// exclui o registro da List<>
var excluiregistro = new Pessoa(Convert.ToInt32(txtId.Text));
excluiregistro.Delete();
lista.Remove(excluiregistro);
}
Botoes(this, [Ô]Excluir[Ô]); // controla os botões habilitados e/ou desabilitados
lista = new List<Pessoa>(new Pessoa().GetAll([Ô]id[Ô])); // cria uma nova lista para atualizar
posicao = lista.Count - 1; // posição == último item da List<>
ObterDados(); // obtem os dados do registro
Navegacao(this); // controla os botões de navegação
}

// obtém os dados do registro que está lendo
private void ObterDados()
{
try
{
txtId.Text = lista[posicao].Id.ToString();
txtNome.Text = lista[posicao].Nome;
Navegacao(this);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
PERCIFILHO 18/03/2016 16:09:13
#459443
Ah! Agora funcionou. Eu estava fazendo errado. Usei o Remove() e era para usar o RemoveAt().
Obrigado Fabiano pela grande ajuda. Tenha um ótimo final de semana.
Tópico encerrado , respostas não são mais permitidas