CRIAR UM EVENTO CURRENTITEMCHANGED

MRSILVA 28/11/2016 11:13:19
#469290
Olá pessoal.

Tenho BindingSource vinculado aos campos do meu formulários e a um DataGridWiew. Queria carregar uma variável sempre que algum campo do meu formulário seja alterado ou iniciado a digitação, estou tentando fazer através do evento CurrentItemChanged do meu BindingSource mas infelizmente não consigo implementar através das pesquisas que fiz e dos exemplos que tem na internet. Alguém tem algum exemplo se possível simplificado de como criar esse evento ou alguma ajuda nesse sentido.


Desde já agradeço a ajuda.
KERPLUNK 28/11/2016 15:43:30
#469294
CurrentItemChanged é um evento que ocorre quando qualquer propriedade do item atual(Current) é modificada, você simplesmente delega um método à ele:


//Esse delegate vai geralmente na inicialização do form
NomeDoBindingSource.CurrentItemChanged += dados_CurrentItemChanged;

void dados_CurrentItemChanged(object sender, EventArgs e)
{
///aqui faça o que quiser, pois esse método será ativado cada vez que uma propriedade do ítem corrente mudar
}
MRSILVA 29/11/2016 09:51:03
#469305
Obrigado Kerplunk!
Achei que o evento CurrentItemChanged só era acionado quando os dados eram alterados, mas na verdade até mesmo quando alteramos de registro o mesmo já é disparado, por isso tive que utilizar o evento listChanged com base no seu exemplo já que quero controlar as alterações nos dados.
Kerplunk estou utilizando como padrão de desenvolvimento os vídeos do Youtub (basicão e reflection) que você fez, com base nisso o controle de alteração de dados é melhor ser feitas através do bindingSource ou existe outro método melhor? Tentei fazer através das classe mas não consegui.

Um exemplo que estou tentando controlar:
Quando um usuário do aplicativo altera de registro e clica em outra linha do DataGridWiew tenho que verificar se ele fez alteração no registro atual, caso tenha, tenho que pedir para ele gravar.

Aproveitando o momento queria agradecer suas aulas no Youtub são ótimas. terão mais?
KERPLUNK 29/11/2016 22:25:26
#469317
Em primeiro lugar, muito obrigado! Veja que nas vídeo aulas, eu implemento propriedades [Ô]IsNew[Ô] e [Ô]IsModified[Ô] que são alteradas conforme os dados da entidade são alterados. Basta verificar essas propriedades, até mesmo com uma expressão lambda para ter uma lista de entidades alteradas.
MRSILVA 29/11/2016 22:53:39
#469320
Mais uma vez obrigado Kerplunk. pela sua ajuda.

Tentei fazer isso conforme os videos, mas percebi que as propriedade [Ô]IsModified[Ô] são modificadas para true em todo momento até mesmo quando clico em uma linha do meu DataGridWiew a classe é acessada e as propriedades já são alteradas dessa forma quando verifico se a propriedade foi alterada ela retorna true em todos os momentos, mesmo quando não altero nada, coloquei pontos de interrupção na minha classe para verificar esse comportamento e constatei isso, e foi por isso que partir para os eventos do bindingSource.para resolver esses problema.
KERPLUNK 30/11/2016 01:34:43
#469321
Esse comportamento, é um erro proposital. Ele cai em um assunto de um vídeo mais adiante, que fala sobre depuração de erros. Para resolver, você precisa criar um outro construtor de classe que receba um parâmetro booleano. Esse parâmetro, é colocado em uma variável interna(private) e no momento da leitura dos dados(quando leio os DataReader, preenchendo as entidades), verifico essa variável. Se ele estiver [Ô]true[Ô], significa que estou lendo os dados na primeira vez, ou seja, não podem estar alterados porque estou lendo do banco e não podem ser novos pelo mesmo motivo, portanto, IsNew e IsModified devem ambas serem setadas para false, assim que terminar a leitura dos dados da entidade.
MRSILVA 26/12/2016 11:04:12
#470054
Obrigado Kerplunk.

Desculpe pela demora em dar retorno da sua ultima resposta, não consegui responder antes.

Tentei fazer como você orientou mas não consegui, então fiz da seguinte forma e está funcionando:

No método todos antes de carregar a lista com cada registro eu modifico a propriedade conforme abaixo.

pro._isModified = false;
_return.Add(pro);

Vou deixar o tópico em aberto por mais um tempo caso alguém queira fazer algum comentário.

Kerplunk estou ansioso por novos videos sobre orientação a objetos.
KERPLUNK 26/12/2016 17:41:52
#470070
Resposta escolhida
No próximo, vamos remodelar o projeto base(de acesso à dados), para usar o LINQ e já ter uma introdução à escopo e contexto de dados. A classe Backwork é bacana para entender como funciona, mas em termos de funcionalidade, deixa muito à desejar. Como falo nos vídeos, se quisermos um método para seleção de clientes por tipo, por exemplo, precisamos criar um método específico para isso. é bacana entender como funciona, mas conforme as necessidades vão aumentando, vai se estendendo demais e a regra de [Ô]quanto mais código, mais possibilidade de erros[Ô], é válida. Com o LINQ, os métodos de procura ficam [Ô]nativos[Ô] por conta de ser implementado um QueryBuilder. Além de simplificar as decorações de classe e propriedades e uma facilidade maior para dados vínculados(Cliente -> List<Contatos>). O LINQ também é muito mais parecido(praticamente a mesma coisa) que o Entity Framework, o que já serve de introdução à ele.
MRSILVA 26/12/2016 18:15:12
#470076
Valeu

Tem previsão do lançamentos dos videos?
KERPLUNK 26/12/2016 21:16:50
#470087
Nope...
MRSILVA 27/12/2016 08:25:05
#470096
Ok, obrigado.
Tópico encerrado , respostas não são mais permitidas