Generalmente al trabajar con aplicaciones que tengan formularios MDI, se requiere que sólo exista una instancia de un formulario a la vez, si bien es cierto que ésto se puede lograr usando el patrón Singleton, esta forma de hacerlo se dificulta al tener una cantidad considerable de formularios hijos.
A continuación se muestra un método genérico para tener sólo una instancia por formulario:
public Form AbrirVentana(Type tipo)
{
return AbrirVentana(tipo.FullName);
}
public Form AbrirVentana(string tipo)
{
try
{
Form formulario = instancias[tipo] as Form; // Recuperar la instancia, si existe
if (formulario == null || formulario.IsDisposed)
{
// Usar Reflection para crear una instancia
formulario = (Form)Activator.CreateInstance(null, tipo).Unwrap();
instancias[tipo] = formulario;
}
if (this.IsMdiContainer)
formulario.MdiParent = this;
formulario.Activate();
formulario.WindowState = FormWindowState.Normal;
formulario.Show();
return formulario;
}
catch (Exception ex)
{
// Procesar el error
throw ex; // return null;
}
}
Al código mostrado arriba falta hacerle unas cuantas modificaciones para darle un poco más de flexibilidad (puesto que sólo se basa en el tipo), pero para empezar creo que está bien.