Empêcher un formulaire de s'ouvrir plus d'une fois.

Résolu
BelleisaTQ
Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
15 juillet 2014
- 2 juil. 2009 à 16:22
sulit06700
Messages postés
8
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
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.

7 réponses

Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
3 juil. 2009 à 00:21
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( );
}
1
cs_Psych0
Messages postés
30
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
22 juin 2010
1
2 juil. 2009 à 16:36
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;
}
0
BelleisaTQ
Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
15 juillet 2014

2 juil. 2009 à 16:48
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.
0
cs_Psych0
Messages postés
30
Date d'inscription
vendredi 21 octobre 2005
Statut
Membre
Dernière intervention
22 juin 2010
1
2 juil. 2009 à 21:05
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BelleisaTQ
Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
15 juillet 2014

2 juil. 2009 à 21:23
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.
0
BelleisaTQ
Messages postés
10
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
15 juillet 2014

3 juil. 2009 à 15:51
Merci pour vos bons conseils !!!

Bonne journée.
0
sulit06700
Messages postés
8
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
8 décembre 2012

23 mars 2013 à 18:13
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.
0