NAVEGAR POR ITEMS DA LIST<>
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.
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.
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.
no Load do Form você verifica se a sua lista contém itens.
No comando First basta você setar pos = 0 e exibir os dados
No comando Last a posição será o tamanho da lista -1.
No comando Next soma 1;
No comando Previous subtrai 1;
Na rotina ExibirDados() basta você selecionar o objeto correspondente ao Ãndice da variável pos.
Para atualiza o item da lista
Só tome cuidado, e faça a checagem dos valores nos comandos Next e Previous para não ultrapassar os limites da lista.
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.
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:
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?
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?
Olha, no caso da consulta, consegui um exemplo bem legal na Net, que fica assim:
Funcionou certinho.
Só falta agora eu saber isso:
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?
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.
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.
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:
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);
}
}
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.
Obrigado Fabiano pela grande ajuda. Tenha um ótimo final de semana.
Tópico encerrado , respostas não são mais permitidas