NAVEGA?ÃO ENTRE REGISTROS (BOTÃO LOCALIZAR)

PERCIFILHO 08/06/2016 09:48:01
#463188
Bom dia, pessoal! Um ótimo dia a todos!
Hoje eu gostaria de um help! em uma questão que estou tentando desde ontem chegar a uma solução, porém não tenho conseguido;
Montei um projetinho de exemplo e vou explicar o que está acontecendo;
Esse projeto é de um cadastro onde já tenho várias pessoas cadastradas e uso os botões para navegar entre os registros;
Em determinado momento pode ser que o usuário necessite consultar os dados de determinada pessoa. Sem precisar abrir a tela de consulta, ele pode utilizar o botão Localizar;
Aí ele digita o código (ou Id) da pessoa e aparece os dados. Até aí deu pra entender, né?
Rodando o exemplo, veremos que o programa abre no último registro e navegando entre os registros, podemos ver que faltam as pessoas com código 9 e 11;
Se [Ô]chamarmos[Ô] o botão Localizar e digitar o código 9, emite a mensagem de que registro não existe, e se digitar o código 10, reparem que o registro mostrado não é o do código 10; Assim acontece também se fizermos o mesmo com o código 11.
Gostaria de saber como posso alterar o meu código para fazer esse tipo de busca?
NOBODY 08/06/2016 10:23:24
#463191
Cara gostaria de te ajudar mais o download que esta anexado não esta abrindo.
Verifica esta questão para eu poder te ajudar???
NOBODY 08/06/2016 10:33:42
#463192
Opa, consegui baixar o anexo estou verificando o código.

NOBODY 08/06/2016 11:36:56
#463193
O teu código esta confuso se fose comigo mudaria o conceito a adaptaria para o Data Binding
veja mais detalhes em: http://www.macoratti.net/08/11/c_db_snc.htm
KURTGU 08/06/2016 11:41:55
#463194
Uma coisa mais simples liste todos os registros dentro de um datagrid ou Listview, coloque uma textbox pesquisar user o Link Concat para filtrar da forma que voce precisa nome, pelo id pelo campo que desejar ao clickar no cliente pesquisado abra a tela com todos os dados...Questão de Design fica a dica...


Anexo com erro, verificar...
DS2T 08/06/2016 17:49:47
#463207
Não deu pra testar porque não tem o arquivo do banco de dados.
Dei uma olhada no código e algumas coisas me chamaram a atenção.

Começando pelo fato da posição não funcionar:

            List<Classes.Pessoa> _lista = new List<Classes.Pessoa>(new Classes.Pessoa().GetAll()).ToList();
var query = from _localizar in _lista
where _localizar.Id == Convert.ToInt32(txt.Text)
select _localizar;
if (query.Count() == 0) { achou = false; } else { achou = true; }
Classes.Geral.posicao = Convert.ToInt32(txt.Text) - 1;


Primeiro, você não pode garantir que o Id vai ser igual a posição do registro. Por exemplo, se você apagar um registro... tudo vai sair de ordem, aí começa a apresentar essas anomalias que você tá vendo. Entendeu?

Imagina que você tenha a seguinte tabela:

Id descricao
1 teste1 (posicao 1 = id)
2 teste2 (posicao 2 = id)
3 teste3 (posicao 3 = id)
4 teste4 (posicao 4 = id)

Agora imagine que você apague o registro de Id = 3:

Id descricao
1 teste1 (posicao 1 = id)
2 teste2 (posicao 2 = id)
[txt-color=#e80000]4 teste4 (posicao 3 <> id)[/txt-color]


Manjou?


Outra coisa perigosa no seu código:

List<Classes.Pessoa> _lista = new List<Classes.Pessoa>(new Classes.Pessoa().GetAll()).ToList();


Reparei que você sempre usa esse método para pegar TODOS os registros e quando tem a lista completa, você aplica o filtro.
Por que você já não faz a consulta no banco de dados com filtro? Vai economizar bastante processamento e memória na parte do cliente. A ideia é deixar o cliente levinho e jogar a complexidade para o servidor, e levando em conta as rotinas de otimização do SQL Server (não sei se o compact tem a camada Optimizer também)... é muito menos custoso deixar o banco de dados fazer isso...
KERPLUNK 08/06/2016 18:21:14
#463210
Eu conheço essa modelagem.

Vou tentar explicar o que você está fazendo:
Você está ainda meio confuso quanto ao conceito. O que você quer fazer é um simples formulário de cadastro com um segundo formulário de consulta, mas você ainda está enxergando a fonte de dados como um recordset, onde posicionamento pode ser significativo. O que você deve fazer é procurar por objetos e trabalhar com objetos. Além disso você está usando essa classe [Ô]Geral[Ô] que é totalmente desnecessária. Minha sugestão é a mesma que já foi feita anteriormente, usar DataBinding para melhorar essa navegação entre objetos. Se quiser, posso fazer um exemplo usando o mesmo design que você está usando.
PERCIFILHO 09/06/2016 07:45:03
#463242
Desculpem a demora em responder, mas ontem aconteceram algumas coisas e não foi possível.
Sonildo --> Valeu pela dica, acho que vou ter que mudar e passar a utilizar o DataBinding.
Kurtgu --> Essa sua dica é uma tela de consulta, mas não é bem esse o caso. Essa tela de consulta também vou fazer depois. Obrigado mesmo assim.
DS2T --> O banco de dados encontra-se na Pasta Bin/Debug, chama-se Teste.sdf. é Sql Server Compact 4.0. Obrigado pelas suas dicas, estou repensando o meu caso.
Kerplunk --> Eu estou trabalhando com objetos, talvez ainda não da maneira mais correta possível. Essa minha classe Geral é onde eu coloquei algumas funções que podem ser utilizadas em todos os outros formulários, como desabilitar botões, limpar campos, etc. Agora, quanto a usar DataBinding, nunca havia utilizado controles vinculados a dados antes, estou começando agora e só com DataGridView. Se você pudesse me ajudar nessa, te agradeço.

Á propósito, não sei o que aconteceu com o anexo. Uma hora eu consigo baixar, outra hora dá erro. Não entendi nada.
PERCIFILHO 09/06/2016 14:21:56
#463253
Refiz meu projeto, agora utilizando um BindingSource para vincular os dados da tabela aos objetos da List<>;
Continuando o que eu queria fazer, é o seguinte: falta corrigir o código do botão Localizar, onde procuro por determinado código e preciso mostrar os dados nas TextBoxes;
Quando digito e vou buscar, aparece a mensagem:
Specified method is not supported.
Como devo fazer nesse caso?
KERPLUNK 09/06/2016 17:26:47
#463265
Você ainda está trabalhando com posicionamento de registros. Tenho um exemplo que fiz com BindingSource para outro tópico mas acho que vai te ajudar.
PERCIFILHO 10/06/2016 09:49:21
#463311
Bom, consegui resolver.
No código do botão Localizar, deixei assim:

List<Pessoa> _lista = new List<Pessoa>(new Pessoa().GetAll()).ToList();
foreach (var item in _lista)
{
if (item.Id == localizar_codigo) // localizar código é a variável que guardou o código digitado para localizar
{
dados.Position = _lista.IndexOf(item);
}
}

Após criar uma List<> com os dados, procura nos itens e quando localizar o registro que satisfaça a condição, atribui o índice dele à posição no DataSource.
Se não for a melhor maneira, pelo menos foi a que eu consegui.
Tópico encerrado , respostas não são mais permitidas