1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.
  2. Informação: Pela 0:30 desta Sexta-feira (9 de Dezembro, 23:30 de Quinta-feira nos Açores) o Fórum e restantes sites da ZWAME vão estar offline para manutenção durante cerca de 1h30.
    Se necessário faremos actualizações via Twitter e Facebook.
    Remover anúncio

Parent Form e User Controls

Discussão em 'Programação' iniciada por aishihara, 15 de Abril de 2008. (Respostas: 17; Visualizações: 1245)

  1. aishihara

    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
     
  2. balute

    balute Power Member

    Essa solução deveria funcionar.

    Certifica-te de que o control já está inserido dentro da tela principal quando essa função é executada.
     
  3. aishihara

    aishihara Power Member

    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.
     
  4. balute

    balute Power Member

    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: 15 de Abril de 2008
  5. aishihara

    aishihara Power Member

    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....
     
  6. balute

    balute Power Member

    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.
    Substitui "UserControl" por "this".
    Se puseste a função dentro da classe TelaPrincipal, substitui "TelaPrincipal" por "this".
     
    Última edição: 15 de Abril de 2008
  7. aishihara

    aishihara Power Member

    Mas no caso quero utilizar a função dentro do controle. Como fazer? Porque se eu colocar a função dentro da tela principal voltarei ao estado que estava.
     
  8. balute

    balute Power Member

    Coloca a função dentro da classe TelaPrincipal, e tenta usá-la assim:
    Código:
    TelaPrincipal.ObterTelaPrincipal(this).Função();
     
    Última edição: 15 de Abril de 2008
  9. aishihara

    aishihara Power Member

    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.
     
  10. balute

    balute Power Member

    Declara a função ObterTelaPrincipal como static.

    Consulta o post #4 para ver como fica.
     
  11. aishihara

    aishihara Power Member

    Ele não deixa usar this no lugar de TelaPrincipal? Alguma outra sugestão?
     
  12. balute

    balute Power Member

    Tem que deixar...
    O "this" refere-se ao próprio objecto (nesse caso, o user control).
    Senão, qual é o erro que aparece?
     
  13. aishihara

    aishihara Power Member

    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". Entende?
     
  14. aishihara

    aishihara Power Member

    Criei um static void. Só preciso de pegar a TelaPrincipal pelo controle e jogar...
     
  15. balute

    balute Power Member

    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: 16 de Abril de 2008
  16. aishihara

    aishihara Power Member

    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??
     
  17. balute

    balute Power Member

    A outra função é aquela que você criou (que eu chamei de "MinhaFunção").
    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")?
     
  18. aishihara

    aishihara Power Member

    Desculpe pela confusão... Parece que deu tudo certo. Agradeço muito pelo seu auxilo e peço desculpas pelos problemas.
     

Partilhar esta Página