12
votes

Trouver les formulaires ouverts dans l'application Windows C #

J'utilise cette fonction pour fermer le formulaire existant et ouvrir un nouveau formulaire.

S'il n'y a pas de formulaire exigeant, il jette une erreur. p>

Erreur: p>

Cible: System.Object MarshaledInvoke (System.Windows.Forms.Control, System.Delegate, System.Object [], Boolean) P>

Message: Invoke ou BeginInvoke Vous ne pouvez pas appeler sur un contrôle jusqu'à ce que la poignée de la fenêtre ait été créée. . P>

pile: sur system.windows.forms.control.marshaledinvoke (appelant de contrôle, méthode de déléguée, objet [] args, boolean synchrone) p>

Donc, il faut donc vérifier pour n'importe quel formulaire avant de fermer le formulaire pour éviter l'erreur. Comment? P>

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


0 commentaires

5 Réponses :



10
votes
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;
        }
I have pasted the two methods one simple one and the second one is the LINQ.

1 commentaires

Vous pouvez renvoyer le résultat de tout directement; Il n'y a pas besoin d'une variable distincte.



4
votes

Si vous connaissez le nom du formulaire que vous pouvez aussi faire comme suit:

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


0 commentaires

2
votes

Cette partie du code recherche une instance existante d'un formulaire Si vous n'existe pas, le montre simplement, et si ce n'est pas en créé une instance de celui-ci xxx


0 commentaires

0
votes

Je pourrais être en retard ici, mais juste au cas où quelqu'un en a besoin. Si Application.OpenForms est manquant sur votre côté, c'est parce que vous devez utiliser system.windows.forms.application.openforms

par exemple: xxx

L'objet FC contient des propriétés telles que: Compte et innerlist (très utile)

espère que cela aide, même s'il est 2021, je pensais que quelqu'un aurait besoin de cette information ( Je ne l'ai pas vu nulle part quand je l'ai cherché)


0 commentaires