Abrindo Formulários Dinamicamente C# (Windows Forms)
Introdução
Uma tarefa comum no desenvolvimento de soluções Windows Forms é a necessidade de instanciar formulários com base no nome da classe, ou seja, como o desenvolvedor pode abrir um formulário dinamicamente (programaticamente) passando o nome deste formulário (classe) como string. Isto é muito comum quando há necessidade de criarmos menus populados dinamicamente a partir de uma base de dados.
Problema
Apesar de representar uma necessidade comum em aplicações Windows Forms, ainda há muitas dúvidas entre os desenvolvedores de como implementar corretamente um procedimento para instanciar um formulário dinamicamente. Faltam exemplos sobre esse tipo prática e os que estão disponíveis na Web não são facilmente encontrados e na maioria das vezes são apresentados em outro idioma.
Solução
Uma construção simples com o método CreateInstance do objeto Activator permite implementar esta funcionalidade. Veja o código abaixo:
public static void OpenForm(string Namespace_FormName, bool System_Modal)
{
Type t = Type.GetType(Namespace_FormName);
if (t != null)
{
System.Windows.Forms.Form f =
(System.Windows.Forms.Form)Activator.CreateInstance(t);
if (System_Modal)
f.ShowDialog();
else
f.Show();
}
}
Instanciando um formulário implementado em outro assembly
Com uma construção semelhante, é possível iniciar um formulário implementado eu outro assembly. Basta modificar o código acima para incluir informações sobre o assembly externo. O exemplo abaixo mostra como iniciar um formulário (MDIChild) contido em outro assembly e centralizá-lo no MDI:
privatevoid OpenChildFormFromExternalAssembly(
string Full_Namespace_Class,
string Root_Namespace,
string Assembly_Version,
string Assembly_Culture,
string Assembly_PublicKeyToken,
bool System_Modal)
{
Type t = Type.GetType(Full_Namespace_Class + "," + Root_Namespace
+ ", Version=" + Assembly_Version
+ ", Culture=" + Assembly_Culture
+ ", PublicKeyToken=" + Assembly_PublicKeyToken);
if (t != null)
{
System.Windows.Forms.Form f =
(System.Windows.Forms.Form)Activator.CreateInstance(t);
f.MdiParent = this;
int TopMargin = 0;
int LeftMargin = 0;
LeftMargin = ((this.Width - f.Width) / 2) + this.Left;
TopMargin = ((this.Height - f.Height) / 2) + this.Top - 50;
f.StartPosition = FormStartPosition.Manual;
f.Top = TopMargin;
f.Left = LeftMargin;
if (System_Modal)
f.ShowDialog();
else
f.Show();
}
}
As linhas abaixo demonstram como invocar o procedimento acima passando os parâmetros necessários:
OpenChildFormFromExternalAssembly(
"EIS.Presentation.frmTipoEis", // Namespace completo
"EIS", // Root Namespace
"1.0.0.0", // Assembly Version (AssemblyInfo.cs)
"neutral", // Cultura (Default=neutral)
"null", // PublicKeyToken (Default=null)
false
);