Empêcher un formulaire de s'ouvrir plus d'une fois. [Résolu]

Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Dernière intervention
15 juillet 2014
- - Dernière réponse : sulit06700
Messages postés
8
Date d'inscription
mercredi 19 janvier 2011
Dernière intervention
8 décembre 2012
- 23 mars 2013 à 18:13
Bonjour,

J'ai un formulaire parent avec menustrip qui lorsque l'on clique sur un choix, ouvre un formulaire enfant.Pour empêcher le formulaire enfant d'ouvrir plus d'une fois, j'ai créer une variable "public static Form _instance = null;"
qui me permet de savoir si le formulaire enfant est déjà ouvert. Mon problème survient lorsque je ferme le formulaire enfant et que je désire le réouvrir par la suite. Comme ma variable n'est plus null, il ne s'ouvre pas.

Auriez-vous une idée ?

voici mon petit bout de code :

private void casesHorairesToolStripMenuItem_Click(object sender, EventArgs e)
{
if (_instance == null)
{
_instance = new frmCaseHoraire();
afficherFormulaire(new frmCaseHoraire());
}
}


Merci.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
1
Merci
Salut,

L'idée de maintenir une variable statique n'est pas mal mais ça impose de la mettre à null à la fermeture de la forme, surtout pour libérer la mémoire.

Peut être que dans ton cas un Dialog serait mieux.. on affiche un Dialog avec ShowDialog( ) à la place de Show( ) et on libère la mémoire avec Dispose( ).

Une autre solution assez simple :

if ( Application.OpenForms[ "Form2" ] == null )
{
    Form f = new Form( );
    f.Name = "Form2";
    f.Show( );
}

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
30
Date d'inscription
vendredi 21 octobre 2005
Dernière intervention
22 juin 2010
0
Merci
Tu peux t'abonner sur l'évènement FormClosed de ton formulaire, et dans la méthode lancée à ce moment là, setter ton instance à null.

if (_instance == null)

{

                    _instance = new frmCaseHoraire();

                    _instance.FormClosing += new EventHandler(fermeture_formulaire);
                    afficherFormulaire(new frmCaseHoraire());

}

private void fermeture_formulaire(object sender, EventArgs e)
{
                    _instance = null;
}
Commenter la réponse de cs_Psych0
Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Dernière intervention
15 juillet 2014
0
Merci
Merci,

mais j'ai encore ce problème qui m'apparaît :Cannot implicitly convert type 'System.EventHandler' to 'System.Windows.Forms.FormClosingEventHandler'

Sur cette ligne :
_instance.FormClosing += new EventHandler(fermeture_formulaire);

Je ne comprend pas...

Merci de m'aider.
Commenter la réponse de BelleisaTQ
Messages postés
30
Date d'inscription
vendredi 21 octobre 2005
Dernière intervention
22 juin 2010
0
Merci
Autant pour moi.
C'est juste que l'événement lancé lors du formClosing n'a pas la forme habituelle :

EventHandler myEvent(object sender, EventArgs e)

Mais requiert un handler qui dérive d'EventHandler, celui mentionné dans le message d'erreur, un FormClosingEventHandler.

Mais rassure toi, tu n'as pas besoin de retenir par coeur quel type d'handler est associé à tel événement, si tu utilises Visual Studio pour tes développements, lorsque tu tappes _instance.FormClosing += l'intellisense va te proposer automatiquement l'eventhandler qu'il faut, il te suffit dès lors de pousser 2x sur TAB pour qu'il s'abonne à l'événement et qu'il te crée la méthode qui sera lancée lorsque l'événement se produira.
Commenter la réponse de cs_Psych0
Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Dernière intervention
15 juillet 2014
0
Merci
Merci de me répondre. J'ai trouvé pour le handler dans le formulaire parent mais ça ne fonctionne pas car lors de la fermeture du formulaire enfant l'évènement n'est pas appelé.

Voici mon code :

private void casesHorairesToolStripMenuItem_Click(object sender, EventArgs e)
{

if (_instance == null)
{
_instance = new frmCaseHoraire();
_instance.FormClosing += new FormClosingEventHandler (_instance_FormClosing);
afficherFormulaire(new frmCaseHoraire());
}
}

private void _instance_FormClosing(object sender, FormClosingEventArgs e)
{
_instance = null;

}

Est-ce que je dois ajouter quelque chose dans le formulaire enfant ?

Merci pour tout.
Commenter la réponse de BelleisaTQ
Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Dernière intervention
15 juillet 2014
0
Merci
Merci pour vos bons conseils !!!

Bonne journée.
Commenter la réponse de BelleisaTQ
Messages postés
8
Date d'inscription
mercredi 19 janvier 2011
Dernière intervention
8 décembre 2012
0
Merci
Bonjour,

Je suis actuellement entrain de programmer un logiciel avec Visual Studio 2008.

Le contexte :
J'ai créé un formulaire/fenêtre MiseEnPage qui comme son nom l'indique permet de positionner des éléments pour la mise en page des autres formulaires/fenêtres. Quand je crée un nouveau formulaire/fenêtre, je le fais hériter de ce dernier pour que la mise en page soit identique.

Mon problème :
Dans ce formulaire MiseEnPage, j'ai un menuStrip qui me permet de naviguer parmi les formulaires/fenêtres.
Seulement, je voudrais faire en sorte que lorsque je suis sur un formulaire/fenêtre actif et que je clique sur le bouton menuStrip qui me permet d'afficher ce formulaire/fenêtre, celui-ci ne bouge pas. C'est-à-dire, qu'il reste actif comme si rien ne s'était passé.

Pour le moment, le code de l'évènement sur le formulaire MiseEnPage est :

form formAccueil = new FormAccueil();
formAccueil.show();
this.hide();


Donc comme je l'ai dit précédemment le "this" peut être le FormAccueil qui serait alors déjà affiché.

Merci, pour vos futures réponses.
Commenter la réponse de sulit06700

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.