2009-07-10 54 views
5

Estoy usando esta función para cerrar el formulario existente y abrir un formulario nuevo.Encuentra los formularios abiertos en la aplicación de Windows C#

Si no hay formulario de exixting, arroja un error.

Error:

Target: System.Object MarshaledInvoke (System.Windows.Forms.Control, System.Delegate, System.Object [], Boolean)

Mensaje: invocar o BeginInvoke no puede ser llamado en un control hasta que se haya creado el identificador de ventana.

Stack: en System.Windows.Forms.Control.MarshaledInvoke (persona que llama Control, método Delegado, objeto args [], síncronos Boolean)

SO necesita comprobar para cualquier forma abierta antes de cerrar la forma de evitar la error. ¿Cómo?

static public void NewMainForm(Form main, bool ClosePreviousMain) 
    { 
      if (main != null) 
      { 
       Global.ActiveForm = main.Text; 
       if (ClosePreviousMain & MyContext.curMain != null) 
       { 
        MyContext.curMain.FormClosed -= new FormClosedEventHandler(main_FormClosed); 
        //Need to check for any form active and then close the form. 
        MyContext.curMain.Invoke(new Action(MyContext.curMain.Dispose)); 
       } 
       MyContext.curMain = main; 
       MyContext.curMain.FormClosed += new FormClosedEventHandler(main_FormClosed); 
       MyContext.curMain.ShowDialog(); 
      } 
    } 

Respuesta

5
if (ApplicationFormStatus.CheckIfFormIsOpen("FormName")) 
{ 
// It means it exists, so close the form 
} 

public bool CheckIfFormIsOpen(string formname) 
     { 

      //FormCollection fc = Application.OpenForms; 
      //foreach (Form frm in fc) 
      //{ 
      // if (frm.Name == formname) 
      // { 
      //  return true; 
      // } 
      //} 
      //return false; 

      bool formOpen= Application.OpenForms.Cast<Form>().Any(form => form.Name == formname); 

      return formOpen; 
     } 

He pegado los dos métodos uno simple y el segundo es el LINQ.

1

Si conoce el nombre del formulario se puede así hacer como esto:

var frm = Application.OpenForms.Cast<Form>().Where(x => x.Name == "MyForm").FirstOrDefault(); 
if (null != frm) 
{ 
    frm.Close(); 
    frm = null; 
} 
2

esta parte del código busca instancia existente de una forma si existe sólo demuestra que, y si no se crea una ejemplo de ello

 `foreach (Form form in Application.OpenForms) 
     { 
      if (form.GetType() == typeof(myMainform)) 
      { 
       form.Activate(); 
       form.Show(); 
       this.Close(); 
       return; 
      } 
     } 

     myMainform m = new myMainform(); 
     m.Show();` 
Cuestiones relacionadas