NAVEGA?ÃO ENTRE REGISTROS (BOTÃO LOCALIZAR)
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?
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?
Cara gostaria de te ajudar mais o download que esta anexado não esta abrindo.
Verifica esta questão para eu poder te ajudar???
Verifica esta questão para eu poder te ajudar???
Opa, consegui baixar o anexo estou verificando o código.
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
veja mais detalhes em: http://www.macoratti.net/08/11/c_db_snc.htm
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...
Anexo com erro, verificar...
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:
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:
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...
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...
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.
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.
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.
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.
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?
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?
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.
Bom, consegui resolver.
No código do botão Localizar, deixei assim:
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.
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