none
Chamar procedimentos públicos em C# RRS feed

  • 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?

    segunda-feira, 20 de novembro de 2017 00:06

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

    segunda-feira, 27 de novembro de 2017 11:07
    Moderador

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

    segunda-feira, 20 de novembro de 2017 07:41
    Moderador
  • 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

    quarta-feira, 22 de novembro de 2017 23:41
  • 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

    quinta-feira, 23 de novembro de 2017 11:45
  • 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.

    quinta-feira, 23 de novembro de 2017 14:48
  • 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

    segunda-feira, 27 de novembro de 2017 11:07
    Moderador
  • Bom dia André.

    Solução elegante e perfeita. Parabéns.

    Abs

    segunda-feira, 27 de novembro de 2017 11:15
  • 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

    segunda-feira, 27 de novembro de 2017 11:54
    Moderador
  • 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.

    segunda-feira, 27 de novembro de 2017 12:07
    Moderador
  • Bom dia André!

    Funcionou certinho! Muito obrigado pela ajuda e atenção! Obrigado a todos também pela ajuda.

    Abraço

    Ediel Clamoroska


    terça-feira, 28 de novembro de 2017 12:56