Usuário com melhor resposta
Chamar procedimentos públicos em C#

Pergunta
-
Pessoal boa noite!
Tenho um procedimento publico chamado CarregarContas() que serve para povoar uma combobox com os dados do Bd que, assim como CarregarContas() estão dentro do Form1. Porém preciso chamá-lo à partir do Form2 para atualizar a combo.
Estou fazendo a declaração padrão assim:
Form1 vAtualizar = new Form1(); //a rotina que carrega a combo está dentro do Form1 é do tipo Public
Depois dentro do evento click do Form2:
vAtualizar.CarregarContas(); //aqui faço a chamada mas nada acontece!
Como resolvo isso?
Respostas
-
Olá Ediel!
Entendi o problema.. O que acontece é que você está criando uma nova instância do Form1 para chamar o método, quando na verdade você deveria chamar o método no Form1 que já está aberto..
Para fazer isso, você poderia passar o Form1 para o Form2 (como outras pessoas sugeriram aqui na thread) ou você poderia também encontrar o Form1 que já está aberto através da propriedade Application.OpenForms, aí sim você chama o método:
var form1 = application.openforms.cast<form>().firstordefault(f => f is frmform1); if (form1 != null) { form1.subcarregarcombobenefícios(); }
Abraço!
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Marcado como Resposta Filipe B CastroModerator segunda-feira, 27 de novembro de 2017 12:06
Todas as Respostas
-
Olá Ediel!
Se você está conseguindo implementar dessa maneira e está compilando, o problema não está na estrutura em si, mas sim, em algum detalhe na implementação desse método.. O que é que você está fazendo nesse método exatamente? Você está povoando um ComboBox do Form1? Se sim, quando você chamá-lo ele carregará o ComboBox do Form1, e não do Form2 (que é o formulário que está fazendo a chamada)..
Caso você queira implementar um método que funcione tanto para um formulário quanto para o outro, o ideal seria criar uma classe utilitária na sua aplicação, aí você teria esse método nessa classe, porém, ele receberia o ComboBox que ele deve carregar..
Entendeu a ideia? Se não tiver entendido, por favor, dê mais detalhes do que você está querendo fazer (se possível com o código do seu método CarregarContas)..
Abraço!
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Olá André! Obrigado por responder.
Acho que não me expressei claramente e vou tentar explicar diferente, mas a lógica é bem simples:
No Form1, onde tem a combo cbbBenefícios que precisa ser atualizada é o local onde atrelo estes benefícios a um CNPJ. Porém o cadastro destes benefícios é realizado no Form2, contudo, ao cadastrar/atualizar um beneficio no Form2 não consigo chamar a rotina que atualiza a combo que esta dentro do Form1.
A rotina que estou usando é essa e funciona perfeitamente quando abro o Form1, porém a dificuldade esta em chamá-la, mesmo sendo publica à partir do Form2.
//No form1 tem esta rotina que preenche a combo
public void subCarregarComboBenefícios()
{clsConexãoBd vConexão1 = new clsConexãoBd();
vConexão1.subCarregarComboBox(cbbBenefícios, "SELECT NomeBenefício " +
"FROM tblBenefíciosFiscais " +
"ORDER BY tblBenefíciosFiscais.NomeBenefício;", "NomeBenefício");
}//no form2 onde cadastro/atualizo os beneficios, estou chamando a rotina acima logo após a inserção no Bd da seguinte forma:
frmForm1 vAtualizarComboBenefícios = new frmForm1 ();
vAtualizarComboBenefícios.subCarregarComboBenefícios(); //ele passa por esta rotina mas nada acontece!
Pelo que entendi sua sugestão é inserí-la em uma classe publica, pois daí fica visível a todos. Mas o fato de ela ser publica mesmo dentro do Form1 não tem o mesmo efeito de estar em uma classe?
Abraço!
Ediel
-
Ediel, bom dia!
Ao invés de instanciar novamente o form1 no form2, seria melhor você passar o form1 como uma propriedade para o form2, e a partir dessa propriedade chamar o seu metodo.
Outra coisa, acho que é melhor você utilizar internal no seu método, ao invés de public
No seu form2, faça o seguinte:
private frmForm1 vAtualizarComboBenefícios; public frmForm1 AtualizarComboBenefícios { set { vAtualizarComboBenefícios = value; } }
Para chamar a rotina do form1, você faz a mesma coisa.
vAtualizarComboBeneficios.subCarregarComboBeneficios();
Qualquer dúvida, estou a disposição.
att.
Felipe
-
Boa tarde Edie.
Existem duas maneiras diferentes para solucionar o problema.
1) Você utilizar o CarregarContas() dentro de uma classe static e chama-la, tanto do form1 como do form2
2) Passar não o form1 como parâmetro para o form2 (que também serve mas pode, dependendo da quantidade de itens sobrecarregar a memória).
Se é um item que você busca do form1, pode passar a própria combo como parâmetro para o form2 e deixa-la carregar.
Na minha humilde opinião, a solução com classe é melhor pois evita de, se você precisar de um 3º formulário, ficar passando por parâmetro. Pense nisso.
Espero ter ajudado.
-
Olá Ediel!
Entendi o problema.. O que acontece é que você está criando uma nova instância do Form1 para chamar o método, quando na verdade você deveria chamar o método no Form1 que já está aberto..
Para fazer isso, você poderia passar o Form1 para o Form2 (como outras pessoas sugeriram aqui na thread) ou você poderia também encontrar o Form1 que já está aberto através da propriedade Application.OpenForms, aí sim você chama o método:
var form1 = application.openforms.cast<form>().firstordefault(f => f is frmform1); if (form1 != null) { form1.subcarregarcombobenefícios(); }
Abraço!
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Marcado como Resposta Filipe B CastroModerator segunda-feira, 27 de novembro de 2017 12:06
-
-
Valeu, Fernando! Abraço!
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Bom dia,
Por falta de retorno essa thread está encerrada.
Se necessário, favor abrir uma nova thread.
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
Bom dia André!
Funcionou certinho! Muito obrigado pela ajuda e atenção! Obrigado a todos também pela ajuda.
Abraço
Ediel Clamoroska
- Marcado como Resposta Ediel Clamoroska terça-feira, 28 de novembro de 2017 12:58
- Editado Ediel Clamoroska terça-feira, 28 de novembro de 2017 12:58
- Não Marcado como Resposta Filipe B CastroModerator terça-feira, 28 de novembro de 2017 14:23