none
Dúvida sobre mostrar e fechar form dentro de panels RRS feed

  • Pergunta

  • Olá amigos.

    Estou desenvolvendo uma aplicação onde eu utilizo um form principal e um "Menu Strip".

    Dentro dessa aplicação eu tenho várias funções, essas funções estão divididas em alguns forms diferentes. A minha dúvida é: qual a melhor forma de chamar um outro form dentro do panel e como esconder ou excluir essa instancia, sendo que eu preciso utilizar ela a qualquer momento.

    Tentei utilizar algumas formas:

    1º 

    // Carrega o form 'frmPedMensal'.
    private void mensalToolStripMenuItem_Click(object sender, EventArgs e)
    {
        pnlPrincipal.Controls.Clear();
        frmp.TopLevel = false;
        pnlPrincipal.Controls.Add(frmp);
        frmp.FormBorderStyle = FormBorderStyle.None;
        frmp.Show();
    }
    
    // Carrega o 'frmSobre'.
    private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
    {
        pnlPrincipal.Controls.Clear();
        frms.TopLevel = false;
        pnlPrincipal.Controls.Add(frms);
        frms.FormBorderStyle = FormBorderStyle.None;
        frms.Show();
    }

    Tenho um panel chamado "pnlPrincipal", um form chamado "frms" e outro "frmp". Dessa forma, eu consigo chamar somente uma vez cada um deles. Por exemplo, eu chamo primeiro o form de nome frms e em seguida, chamo o form de nome frmp. Caso eu chame novamente o form de nome frms ele parece no panel mas fica como se estivesse reduzido.

    Dentro dos dois forms (frms e o frmp) tenho o seguinte código:

    WindowState = FormWindowState.Maximized;

    Pois quero que toda a aplicação funcione por padrão maximizada.

    2-

    // Carrega o form 'frmPedMensal'.
    private void mensalToolStripMenuItem_Click(object sender, EventArgs e)
    {
        frms.Hide();
        frmp.TopLevel = false;
        pnlPrincipal.Controls.Add(frmp);
        frmp.FormBorderStyle = FormBorderStyle.None;
        frmp.Show();
    }
    
    // Carrega o 'frmSobre'.
    private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
    {
        frmp.Hide();
        frms.TopLevel = false;
        pnlPrincipal.Controls.Add(frms);
        frms.FormBorderStyle = FormBorderStyle.None;
        frms.Show();
    }


    Consigo chamar cada um uma vez. A partir da segunda, não consigo chamar mais nenhum, eles não aparecem dentro do panel.

    3-

    // Carrega o form 'frmPedMensal'.
    private void mensalToolStripMenuItem_Click(object sender, EventArgs e)
    {
        pnlPrincipal.Controls.Clear();
        frmPedMensal frmp = new frmPedMensal();
        frmp.TopLevel = false;
        pnlPrincipal.Controls.Add(frmp);
        frmp.FormBorderStyle = FormBorderStyle.None;
        frmp.Show();
    }
    
    // Carrega o 'frmSobre'.
    private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
    {
        pnlPrincipal.Controls.Clear();
        frmSobre frms = new frmSobre();
        frms.TopLevel = false;
        pnlPrincipal.Controls.Add(frms);
        frms.FormBorderStyle = FormBorderStyle.None;
        frms.Show();
    }

    A terceira foi a melhor solução que achei para isso. Funcionou exatamente como eu queria (acabei pensando nela enquanto eu escrevia sobre essa dúvida rs). Essa seria a melhor forma?

    Uma outra dúvida, eu consigo criar uma instancia genérica para um form?

    Se pensar que eu utilizarei 5 ou 100 forms, ter que instanciar 5 ou 100 objetos de uma vez? Por exemplo:

    frmPedMensal frmp = new frmPedMensal();
    frmSobre frms = new frmSobre();

    Ou eu conseguiria criar uma instancia genérica e só chamar o form que eu quiser?

    Obrigado pela atenção.

    quinta-feira, 30 de julho de 2015 00:12

Respostas

  • Olá NouRuem,

    Sobre a criação de forms genéricos:

    Link 01 

    Link 02

    Link 03

    Sobre a sua outra dúvida:

    Analisando o código que você postou, de acordo com o meu ponto de vista a resposta é sim. Porém é importante lembrar que cada tem uma maneira diferente de pensar. Muitas vezes um mesmo caminho pode ser percorrido de muitas maneiras diferentes.


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e 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.

    • Marcado como Resposta Marcos SJ quinta-feira, 30 de julho de 2015 19:56
    quinta-feira, 30 de julho de 2015 19:55

Todas as Respostas

  • Olá NouRuem,

    tudo bem?

    Qual foi o impacto da terceira opção no seu projeto? Eu sei que você disse que ela [Funcionou exatamente como queria], mas ainda assim acha que talvez possa haver uma maneira melhor, portanto eu imagino que houve algum impacto, poderia compartilhar isso conosco?

    Create instance of generic type

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e 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.

    quinta-feira, 30 de julho de 2015 13:47
  • A terceira opção como falei, funcionou perfeitamente. Abri e fechei os forms diversas vezes em ordens diferentes e realmente funcionou.

    A dúvida mesmo seria se esta forma seria a melhor. E sobre criar um form genérico, teria como?

    quinta-feira, 30 de julho de 2015 18:58
  • Olá NouRuem,

    Sobre a criação de forms genéricos:

    Link 01 

    Link 02

    Link 03

    Sobre a sua outra dúvida:

    Analisando o código que você postou, de acordo com o meu ponto de vista a resposta é sim. Porém é importante lembrar que cada tem uma maneira diferente de pensar. Muitas vezes um mesmo caminho pode ser percorrido de muitas maneiras diferentes.


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e 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.

    • Marcado como Resposta Marcos SJ quinta-feira, 30 de julho de 2015 19:56
    quinta-feira, 30 de julho de 2015 19:55
  • Sem problema.

    Vou continuar a usar dessa forma.

    Agradeço a resposta e obrigado pela ajuda nos forms genéricos. :)

    sexta-feira, 31 de julho de 2015 13:01
  • Marcos Veja se isso pode ajuda-lo

    Formulario ObjetoFormaulario= (Formulario)Application.OpenForms["Formulario"];

    Assim você poderá cria uma instância que pode ser minimizada e quando chamada novamente continua com status de quando foi para segundo plano.

    att

    sexta-feira, 31 de julho de 2015 18:32