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

BelleisaTQ 10 Messages postés vendredi 26 juin 2009Date d'inscription 15 juillet 2014 Dernière intervention - 2 juil. 2009 à 16:22 - Dernière réponse : sulit06700 8 Messages postés mercredi 19 janvier 2011Date d'inscription 8 décembre 2012 Dernière intervention
- 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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 3 juil. 2009 à 00:21
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( );
}

Merci Lutinore 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Lutinore
cs_Psych0 30 Messages postés vendredi 21 octobre 2005Date d'inscription 22 juin 2010 Dernière intervention - 2 juil. 2009 à 16:36
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
BelleisaTQ 10 Messages postés vendredi 26 juin 2009Date d'inscription 15 juillet 2014 Dernière intervention - 2 juil. 2009 à 16:48
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
cs_Psych0 30 Messages postés vendredi 21 octobre 2005Date d'inscription 22 juin 2010 Dernière intervention - 2 juil. 2009 à 21:05
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
BelleisaTQ 10 Messages postés vendredi 26 juin 2009Date d'inscription 15 juillet 2014 Dernière intervention - 2 juil. 2009 à 21:23
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
BelleisaTQ 10 Messages postés vendredi 26 juin 2009Date d'inscription 15 juillet 2014 Dernière intervention - 3 juil. 2009 à 15:51
0
Merci
Merci pour vos bons conseils !!!

Bonne journée.
Commenter la réponse de BelleisaTQ
sulit06700 8 Messages postés mercredi 19 janvier 2011Date d'inscription 8 décembre 2012 Dernière intervention - 23 mars 2013 à 18:13
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.