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();
}
}
5 Réponses :
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.
Vous pouvez renvoyer le résultat de tout code> directement; Il n'y a pas besoin d'une variable distincte.
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;
}
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
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 par exemple: p> L'objet 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é) p> p> system.windows.forms.application.openforms code>