Problemas con MDI en .Net y una pequeña solución

Hace un tiempo se me ocurrió la grandiosa idea de tener un contenedor MDI (Interfaz de Múltiples Documentos) dentro de otro; es no es mas que mostrar múltiples documentos (forms) dentro de otro form al mismo tiempo; el form principal es llamado MDIContainer, resulta que .Net no deja que un form que sea MDIContainer, sea ubicado dentro de otro MDIContainer. Si tratamos de hacer esto obtendremos la excepción “Un formulario no puede tener una interfaz MDI secundaria y una MDI primaria a la vez.”.

Veámoslo de la siguiente manera, los formularios MDI se convierten en MDIParent, los formularios agregados a él, se convierten en MDIChildren. El asunto esta en que un MDIParent no puede ser a la vez un MDIChildren. Y es que es algo lógico, pasaría lo que pasa en televisión cuando una cámara filma al un televisor mostrando lo que la cámara esta filmando, este efecto no seria deseable para nuestra aplicación Windows.


Investigando un poco mas (neceando), descubrí que los formularios al convertirse en un MDIContainer, la propiedad TopLevel esta marcada como verdadera, según MSDN es la que “indica si el formulario debe mostrarse como ventana de nivel superior“. Si esta marcada como verdadera entonces este formulario no puede estar dentro otro formulario con el TopLevel marcada como verdadera, otra vez recurro a la MSDN “Un formulario de nivel superior es una ventana que no tiene formulario principal o cuyo formulario principal es la ventana del escritorio. Las ventanas de nivel superior se usan normalmente como formulario principal de la aplicación.


Por un tiempo busque una opción valida para poder poner un MDIContainer dentro de otro, pero no encontré una, lo que si encontré fue una forma de simular el comportamiento que deseo.

Resulta que los Controles de Windows Forms tienen una propiedad llamada Controls. Esta propiedad es una colección de controles, en esta colección están los controles que conforman dicho control, es de lectura y escritura, por lo que en teoría, en cualquier control podemos agregar otro control, incluyendo...un formulario.

No se si a esta altura a alguien ya se le ha ocurrido algo descabellado, por si acaso no...les voy a decir algo, saben que es poner dentro de un botón un formulario? que tengamos un panel y le agreguemos un formulario? que a un boton le agreguemos un textbox? bueno todo esto es posible. Claro esta hay una limitante para esto, los controles que se agreguen a otros y tengan la propiedad TopLevel siempre debe estar marcada como false. Esto es que los formularios se pueden agregar a otro control, sin necesidad de ser puestos en MDIContainner.



Comentarios

Entradas populares de este blog

Opción para MDIContainer

Un poquito System.Activator