2009-07-10 9 views
5

Sto utilizzando questa funzione per chiudere il modulo esistente e aprire un nuovo modulo.Trova i moduli aperti nell'applicazione windows C#

Se non esiste un modulo di exixt, genera un errore.

Errore:

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

Messaggio: Invoke o BeginInvoke non può essere chiamato su un controllo finché non è stata creata la maniglia della finestra.

Stack: a System.Windows.Forms.Control.MarshaledInvoke (chiamante controllo, metodo delegato, Object [] args, sincroni booleana)

quindi necessità di controllare qualsiasi forma aperta prima di chiudere il modulo per evitare la errore. Come?

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(); 
      } 
    } 

risposta

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; 
     } 

Ho incollato i due metodi uno semplice e il secondo è il LINQ.

1

Se si conosce il nome del modulo è possibile anche fare in questo modo:

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

questa parte del codice cerca un'istanza esistente di una forma se esiste solo lo mostra, e se non crea un istanza

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

     myMainform m = new myMainform(); 
     m.Show();` 
Problemi correlati