Parent Form e User Controls

aishihara

Power Member
Bom dia,

Tenho a seguinte dúvida: Estou usando um winform e User Controls em C#. Gostaria de chamar uma função da tela principal depois que executo uma ação no User Control(ex. Clique de botão).
Uma pessoa me deu a seguinte solução: (Parent as "TelaPrincipal")."Função"();. Mas... toda vez que faço essa ação ele me envia a seguinte mensagem: Object reference not set to an instance of an object. Não tenho muita ideia do que fazer, por isso peço a ajuda de vocês.

Desde já agradeço a atenção.

André Ishihara
 
Essa solução deveria funcionar.

Certifica-te de que o control já está inserido dentro da tela principal quando essa função é executada.
 
Eu chamo o controle através de uma panel. Isso faz alguma diferença? E são alguns controles. Eu chamo o controle correspondente atraves de cliques em alguns botões localizados no primeiro panel. E o controle aparece no segundo panel.
 
Nesse caso, é melhor criar uma função que faz uma procura da tela principal.
Por exemplo:
Código:
    public static TelaPrincipal ObterTelaPrincipal(control Ctl)
    {
        if (Ctl.Parent == null) {throw new Exception("Não encontrou nada.");};
        if (Ctl.Parent is TelaPrincipal) {return (Ctl.Parent as TelaPrincipal);};
        return ObterTelaPrincipal(Ctl.Parent);
    };
Depois basta fazer isto:
Código:
TelaPrincipal.ObterTelaPrincipal(this).<função>();
 
Última edição:
No caso os controles ficam numa pasta diferente dos forms. Então ficaria assim? TelaPrincipal = "PASTA.Tela" e UserControl = (Control)"Nome do user control!"? Pq do jeito q vc passou e implementei não funcionou. Porque ocorreu duas mensagens. primeiro o User Control foi considerada um tipo mas está sendo usada como variavel. E a tela principal é um tipo que não é valido no contexto....
 
No caso os controles ficam numa pasta diferente dos forms. Então ficaria assim? TelaPrincipal = "PASTA.Tela" e UserControl = (Control)"Nome do user control!"?
Não, as pastas servem apenas para uma questão de organização. No código e durante a compilação, é como se não existissem pastas.
Pq do jeito q vc passou e implementei não funcionou. Porque ocorreu duas mensagens. primeiro o User Control foi considerada um tipo mas está sendo usada como variavel.
Substitui "UserControl" por "this".
E a tela principal é um tipo que não é valido no contexto....
Se puseste a função dentro da classe TelaPrincipal, substitui "TelaPrincipal" por "this".
 
Última edição:
Coloca a função dentro da classe TelaPrincipal, e tenta usá-la assim:
Código:
TelaPrincipal.ObterTelaPrincipal(this).Função();
 
Última edição:
A parte do this dentro da Tela Principal não funcionou. E A função que você passou não funciona. E se funcionasse já poderia chamar a função diretamente ao inves de fazer isso.
 
Você não esta dizendo para usar a função dentro da tela prinicipal?? Então.. É na tela principal que ele não deixa usar this no lugar de "TelaPrincipal".
Mas o "this" é para ser utilizado na chamada à função ObterTelaPrincipal, que é para passar o user control por parâmetro.

Vai ter 2 funções, ambas declaradas dentro da classe TelaPrincipal:
  • A que irá ser chamada a partir do user control (vamos chamar de "MinhaFunção");
  • A que devolve a tela principal, que se chama ObterTelaPrincipal - consulte o post #4 para ver como fica (acho que é só copiar e colar).
Dentro do UserControl, para fazer uma chamada à função MinhaFunção, fica assim:
Código:
TelaPrincipal.ObterTelaPrincipal([COLOR=Red][B]this[/B][/COLOR]).MinhaFunção();
 
Última edição:
Deixa eu ver se eu entendi...
Você vai ter a função ObterTelaPrincipal que retornaria a tela. E outra função que executaria a ação é isso??
Outra pergunta você já chegou a ver a minha resposta que eu avisei sobre o static void??
 
Deixa eu ver se eu entendi...
Você vai ter a função ObterTelaPrincipal que retornaria a tela. E outra função que executaria a ação é isso??
A outra função é aquela que você criou (que eu chamei de "MinhaFunção").
Outra pergunta você já chegou a ver a minha resposta que eu avisei sobre o static void??
Sim, mas não entendi bem. Criou uma função declarada como static void? Seria essa a função que você quer chamar pelo user control ("MinhaFunção")?
 
Back
Topo