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 41
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
Rejoignez-nous