Probleme de formulaire

Signaler
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
bonjour,
j'ai un formulaire a partir duquel j'en appelle un autre
mon_form fo= new mon_form();
mon_form.show();
 et je voudrais que le formulaire qui appelle mon form soit fermé ensuite
alors je mets this.dispose()
comme ce formulaire contient l'autre ;lorsqu'il est disposed l'autre l'est egalement
Comment peut -on faire pour faire disparaitre le fromulaire appelant sans faire disparaitre le fils?

15 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
y a un souci dans ton code ;)

mon_form fo= new mon_form();
fo.show();

le this.Dispose() ne ferme pas que le formulaire mais aussi l'application... du moins si ce formulaire est celui-ci qui est lancé au démarrage de l'application.

Essaye plutot de le masquer :
this.Hide();

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Salut,
Il ne faut pas appeler la méthode Dispose mais la méthode Close.
Et ça marche... :-)

<hr size="2" />VC# forever
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
ok


merci


sinon en general fo faire close ou dispose?


je croyais que dispose ct mieux . que ca supprimer ttes les ressources et que donc ct plus leger apres un dispose qu'n close.


Bref question suivante quand utiliser close et quand utiliser dispose?


 
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
ca dépend...

si tu as encore besoin d'utiliser ton formulaire, il est préférable de faire un Close()... par exemple, récupérer la valeur d'une propriété...
par contre, si le formulaire n'a plus de raison d'être... Dispose().

la meilleur habitude à prendre c'est de faire ceci :

string ret;
using (MonForm f = new MonForm()) {
    if (f.ShowDialog() == DialogResult.OK) {
       // je travaille encore avec les propriété de mon formulaire...
       ret = f.MonPropriete;
    }
} // ici le using fait un Dispose() tout seul.

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Si c'est une forme modale ouverte avec ShowDialog, Close n'appelle pas Dispose, il faut le faire soit même, cela permet de faire apparaître et disparaître la forme plusieurs fois sans la créer et la détruire à chaque fois, par contre avec une forme non modale ouverte avec Show, Close appelle toujours Dispose.

public partial class Form1 : Form
{
    public Form1( )
    {
        InitializeComponent( );


        this.Click += delegate { this.Close( ); };
        this.Show( );
    }


    protected override void Dispose( bool disposing )
    {
        try
        {
            MessageBox.Show( "Disposed !!" );
        }
        finally
        {
            base.Dispose( disposing );
        }
    }
}
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Il me semblait bien que Close() était appelé, mais je voulais pas dire de bêtise.
Par contre, je ne connaissais pas la petite astuce pour la fenêtre ouverte en ShowDialog !
Donc merci pour cette petite précision...

<hr size="2" />VC# forever
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
Merci bien pour toutes ces precisions cela me semble un peu plus clair maintenant.
Pour résumer si je veux pouvoir rappeler un formulaire qui a été fermé sans en créer un nouveau, je fais
formulaire.showdialog et ensuite je peux faire close (ou cliquer sur la croix du formulaire)?
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
par contre, g pas capté le dialogresult.OK, comment attribue-t-on la valeur OK ?
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
dans mon formulaire
g instancier l'evenement from closed et mis DialogResult=DIalogresult.OK
c ca?
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
37
dans les propriétés de ton formulaire, tu en as 2 qui sont pratiques :
<li>AcceptButton</li><li>CancelButton</li>Par défaut, ton formulaire changera la couleur du bouton "AcceptButton" pour qu'il soit "par défaut", et le "CancelButton" sera relié à la touche Echappe.

Dans le délégue de l'évènement Click de ton AcceptButton, à la fin de ton traitement il te suffit de faire ceci :
this.DialogResult = DialogResult.OK; // ou this est le formulaire courant.

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
ah ben en parlant de ca,
je n'ai aucune idee de comment on utilise ces boutons (comment on les configure)
ainsi que le helpbutton

je les ai jamais utilisé au final

merci pour ton aide
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Tu peux tout faire via le designer, dans les properties (tu vas pas exemple sous CancelButton, et la il te créer une liste avec tout les boutons disponible sur ta form qui peuvent être rattaché au Cancel).

Pour le bouton d'aide, il suffit d'assigner à un Control l'event HelpRequested qui est déclenché quand on clique dessus avec le "?".

<hr size="2" />VC# forever
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
je ne comprends pas trop l'interet des cancel button et accept button


en fait on assigne des boutons du formulaire et ensuite ? (cela donne - t -il la propriete dialogresult.ok ou Cancel au dialogresult du formulaire?

Par contre pour le help button , je pensais qu'il y aurait justement un bouton avec ? pres des bouton sstandards en haut a droite du formulaire. Mais si je met la prpriete helpbutton a true, je n'obtiens rien, je vois pas du totu comment faire.

Ou pourrais-je trouver des exemples?
ou en avez vous?

Merci
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Pour le help, les properties MaximizeBox et MinimizeBox doivent absolument être les deux sur false. Ensuite tu verras apparaître le point d'interrogations. Puis, tu t'abonnes à l'event HelpRequested comme dit plus haut, et l'event sera déclenché si le user clique sur le bouton "?" puis sur ton control.

Pour ce qui est des CancelButton et AcceptButton, c'est juste des simplifications. Si tu as par exemple un bouton annuler qui ferme ta form, tu le set comme CancelButton et si le user clique sur ESC ca va directement appeler le code qu'exécute le bouton annuler (et donc certainement fermer la Form). En plus, ça te permet de faire directement des tests du genre :

if(myForm.ShowDialog() ==
DialogResult.Cancel)

{
   // ...
}

<hr size="2" />VC# forever
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Tu peux eviter de passer par un évènement, la classe button a une propriété DialogResult, c'est la valeur qui sera renvoyée si tu affiches la forme avec ShowDialog.

public class Form2 : Form
{
    public Form2( ) : base( )
    {
        Button accept = new Button( );
        accept.Text = "OK";
        accept.Location = new Point( 10, 10 );
        accept.DialogResult = DialogResult.OK;
        this.AcceptButton = accept;


        Button cancel = new Button( );
        cancel.Text = "Cancel";
        cancel.Location = new Point( 10, 80 );
        cancel.DialogResult = DialogResult.Cancel;
        this.CancelButton = cancel;


        this.Controls.AddRange
        (
            new Control[ ] { accept, cancel }
        );
    }
}