2010-01-07 7 views
7

Estoy trabajando en una aplicación en la que hay un formulario principal y varios formularios más que se pueden usar al mismo tiempo. cuando un usuario hace clic para abrir otro formulario, me gustaría hacerlo para que al hacer clic en el botón del formulario no se abra el formulario nuevamente si ya está abierto.impidiendo que una instancia múltiple de un formulario muestre

showDialog no funciona porque el usuario aún necesita tener acceso a los controles en el formulario principal.

aquí está mi código para la ventana de ayuda, todos los demás formularios se abren de la misma manera.

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Form help = new help(); 
      help.Show(); 
     } 

Respuesta

10

Use un Singleton:

class HelpForm : Form 
{ 
    private static HelpForm _instance; 
    public static HelpForm GetInstance() 
    { 
    if(_instance == null) _instance = new HelpForm(); 
    return _instance; 
    } 
} 

....... 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    HelpForm form = HelpForm.GetInstance(); 
    if(!form.Visible) 
    { 
     form.Show(); 
    } 
    else 
    { 
     form.BringToFront(); 
    } 
} 
+1

Haciendo que la variable _instance sea nula al cerrar el formulario será perfecto con esto :) –

+0

@mletterle su código parece tener un error ya que una variable no estática no se puede usar dentro de un método estático – ako

+0

Gracias, arreglado .. – mletterle

2

Dependiendo de cómo desea manejar esta usted podría hacer algunas cosas:

  1. utilizar el Singleton pattern con una cerradura de seguimiento global que se libera cuando la forma está dispuesto
  2. administrar el estado de el formulario de llamada, y simplemente llame a "mostrar" si el formulario ya se ha iniciado.
  3. prelanzamiento la forma, pero no lo demuestre, que forma de gestionar una referencia única y simplemente mostrar como sea necesario
-3

intentar hacer su forma de ayuda global.

private Form help; 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
     if(help == null) 
      help = new help(); 

     help.Show(); 
    } 
+1

downvoter, por favor explique. – junmats

10

Alternativamente, puede utilizar las formas abiertas de la aplicación para ver si está abierto

btn_LaunchHelp(object o, EventArgs e) 
{ 

    foreach (Form f in Application.OpenForms) 
    { 
     if (f is HelpForm) 
     { 
      f.Focus(); 
      return; 
     } 
    } 

    new help().Show(); 
} 

Editar: Para ser más claro, esto permite al usuario cerrar la Ayuda en cualquier momento y hacer es mucho más fácil de administrar que guardar una referencia a la ventana de Ayuda. Nada para limpiar, nada para mantener.

-1

¿Ha considerado hacer un formulario de MDI? Esto garantiza que su formulario principal siempre esté visible y que sus formularios secundarios estén dentro del padre. Luego, solo tiene que recorrer su lista de formularios y llamar a Show en ellos. No se necesitan solo (lo que muchos consideran una mala práctica de programación).

0

Quizás te ayude.

private Form help; 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (help == null || (help != null && help.IsDisposed)) 
     { 
      help = new Form(); 
     } 
     if (!help.Visible) 
     { 
      help.Show(); 
     } 
     else 
     { 
      help.BringToFront(); 
     } 
    } 
0

Puede proceder de esta manera, declarar theese 2 variables en la parte superior:

private static readonly object MyLock = new object(); 
private static Form1 _Instance = null; 

Y después

public Form1 GetFormInstance 
{ 
     get 
     { 
      lock (MyLock) 
      { 
       if (_Instance == null || _Instance.IsDisposed) 
       { 
        _Instance = new Form1(); 
       } 
       else 
       { 
        _Instance.BringToFront(); 
       } 
       return Form1._Instance; 
      } 
     } 
} 

Poner en caso Form1_FormClosed

Form1._Instance = null 

Después llame al formulario de esta manera:

Form1.GetFormInstance.Show(); 

Espero que ayude.

Cuestiones relacionadas