Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] Gestion des formulaires en Mdi

Form fermé et toujours présent dans MdiChildren

Sujet résolu
    3 juillet 2011 à 19:30:50

    Bonsoir à tous,

    Je suis actuellement en train de créer une Application en Mdi.
    Je connais très bien les bases de form parent/form enfant

    Par contre je suis embêté sur un point, nous savons tous que dans le form parent, l'attribut MdiChildren contient un tableau de formulaires représentant les formulaires apparentés.

    Donc par exemple, pour fermer tous les formulaires d'un seul coup, je procède ainsi :

    foreach(Form f in this.MdiChildren)
    {
       f.close();
    }
    


    Rien de plus banal, j'ai testé et retesté, ça marche impeccable. J'ai vérifié juste après ce tableau de formulaires MdiChildren et il demeure vide. Cela signifie donc que lorsqu'un formulaire est fermé, celui ci n'est plus dans le tableau MdiChildren.

    Okay jusqu'ici tout va bien, alors j'ouvre un formulaire enfant et puis cette fois ci je le ferme à l'aide de la petite croix rouge. Le formulaire se ferme correctement, rien à dire.
    Maintenant vérifions le tableau MdiChildren : le formulaire est toujours présent dans ce tableau.

    Celà est un gros problème pour mon application, car en effet, mon formulaire enfant permet d’éditer un fichier, l'édition de plusieurs fichiers à la fois et nécessaire dans mon application. Donc lorsque j'ouvre un autre fichier c'est le même formulaire enfant qui est ouvert.
    Par contre lorsque j'ouvre un fichier et que celui ci a déjà été ouvert, je le vérifie dans ce tableau de formulaires justement :

    foreach(Form f in this.MdiChildren)
    {
       if(f.Text == openFileDialog.FileName)
       {
          // On le met en focus pour montrer à l'utilisateur qu'il a déjà été ouvert
          f.Activate();
       }
       else
       {
          // J'ouvre mon fichier ici
       }
    }
    


    Donc vous commencez à comprendre mon problème ?

    Si je ferme mon fichier à l'aide de la croix rouge, et que je veux le ré ouvrir à nouveau, celui ci ne s'ouvre pas tout simplement car il reste dans le tableau des formulaires enfants et est considéré comme ouvert.

    Donc comment serait possible de régler ce problème qui est très gênant dans la gestion de plusieurs fichiers :p

    Merci infiniment pour votre aide camarades :)
    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2011 à 10:00:31

      Tout simplement en instanciant à chaque fois un nouveau formulaire, non?

      Dans ta procédure pour afficher le formulaire, tu fais un truc du genre :

      Form myForm = new Form();
      myForm.ShowDialog();
      


      Comme ça, chaque fois que tu fais ça tu aura une nouvelle instance.
      Après concernant ce problème avec Mdi... Essaie d'adapter ce que je t'ai dit ^^

      Concrétement la méthode Close ne permet pas de supprimer le formulaire en MDI il me semble, regarde plutôt du coté de Dispose
      • Partager sur Facebook
      • Partager sur Twitter
        4 juillet 2011 à 13:26:14

        Bonjour, en faite j'avais oublié de mettre le tag résolu, car j'ai procédé différemment et pseudo réglé mon problème.
        En effet j'utilise la méthode IsDisposed pour vérifier l'état du formulaire.
        Je pense que c'est un bug, soit dans mon code soit dans le framework, je m'explique :

        Pour comprendre d'où venait le problème, j'ai crée un autre formulaire enfant qui toutes les 500ms affiche la liste des formulaires présents dans MdiChildren (foreach). Cette mise à jour en temps réel affiche correctement les formulaires ouverts et disparaissent de la liste lorsque je les quitte à l'aide de la croix. Un fonctionnement normal je dirais.
        Mais lorsque je ferme ce formulaire ou j'affiche le contenu de MdiChildren, le problème revient à nouveau.

        Donc j'ai juste modifié la façon dont je gère l'ouverture de mes fichiers :

        if(openFileDialog() == DialogResult.OK)
        {
        	bool open = true;
        	foreach (Form f in this.MdiChildren)
        	{
        		// Tous mes formulaires possèdent le nom du fichier ouvert en Tag
        		if ((string)f.Tag == FileName)
        		{
        				f.Activate();
        				f.Focus();
        				open = false;
        				
        				// Si le formulaire est bien fermé masi présént dans la liste, on le détruit
        				if (f.IsDisposed)
        				{
        					f.Close();
        					open = true;
        				}
        		}
        	}
        
        	// J'ai une autre fonction qui permet de désérialiser le fichier
        	if(open)
        		openFile(FileName);
        }
        


        Voilà en espérant avoir aidé d'autres :)
        • Partager sur Facebook
        • Partager sur Twitter

        [C#] Gestion des formulaires en Mdi

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown