Blog

C# (.Net) Abrir formulario hijo solo una vez

Posted by:

Cuando comienzas a programar en .net, te emocionas a medida que vas avanzando y haciendo cosas que hacen otros programas.
Una de las cosas que más mola, es cuando tocas los formularios padres e hijos (MDI).

Lo primero que encuentras por la red es como crear un formulario padre, luego uno hijo, instanciarlo y mostrarlo, más o menos los pasos serían estos:

  1. Creas un formulario principal, y en las propiedades le dices que es MDIContainer=True
  2. Añades un menú o un botón para que al hacer click se abra el menú hijo.
  3. Creas un formulario Hijo que será la ventanita que hará lo que tu quieres.
  4. En el Formulario hijo picas el siguiente código:
C#:

  1.  

y claro al hacer click, se abre el formulario hijo (perfecto, ¿no?) Pues NO, porque con la emoción, sigues pulsando y la ventanita de marras se abre media docena de veces.

Luego piensas que aquello no queda muy elegante, y buscando por la red, el Sr. Google te habla del Patrón Singleton. ¿Singlequeeeee???

Defino:

El patrón de diseño singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.

Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.

El patrón singleton se implementa creando en nuestra clase un método que crea una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).

Así que el código tan bonito que habíamos escrito antes en el formulario padre, hay que tirarlo a la basura y hacer los siguientes pasos (según Juan Diego Bueno).

  • En el Formulario Hijo, hay que añadir el siguiente código
C#:

  1.  

  • En el Formulario Padre, sustituir el código de antes por lo siguiente:
C#:

  1.  

Y con estos cambios, nuestra ventana solo se abrirá una vez.

5


About the Author:

Discussion

  1. Carlos Caxaj  June 29, 2011

    de la p…. madre…. ya me habia casi dado por vencido intente de todo… y nada de la unica manera q medio me habia funcionado era:

    if(xtraTabbedMdiManager1.Pages.Count!=0)
    {
    hacia todo el resto
    }

    pero Me bloqueaba todo q Mi@#$ jeje pero gracias!! por coMpartir!!!

    Suerte!!

  2. Roger Pérez E  July 10, 2012

    Muy bien por este aporte. Intente de todo y no lograba instanciar una sola vez el formulario.
    Muchas Gracias

  3. edward  July 26, 2013

    He intentando de todo con el código que proporcionas, lo he pegado y nada mas no me funciona
    has de cuenta que mi formulario padre se llama: ventanaMenu y mi hijo formAspiranteSolicitud, ya he pegado el primer codigo depues del inicialization de mi formAspirantes.. pero no me lo detecta en el padre cuando escribo

    formAspiranteSolicitud aspirantes = new formAspiranteSolicitud();
    aspirantes.DefInstance.MdiParent=This;
    aspirantes.DefInstance.Show();

    no me sale me podrías asesorar ??

  4. edward  July 26, 2013

    Obviamente he cambiado los nombres del form2 por los de mi clase formAspiranteSolicitud

  5. Joan Carlos  December 21, 2013

    Waooo mi hermano muchas gracias!!! me funcionó perfectamente 😀

Add a Comment

UA-30641277-1