Usuário com melhor resposta
Dúvida sobre mostrar e fechar form dentro de panels

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.
Respostas
-
Olá NouRuem,
Sobre a criação de forms genéricos:
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
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
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.
-
-
Olá NouRuem,
Sobre a criação de forms genéricos:
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
-
-
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