IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] tester Fenetre déja ouverte?


Sujet :

Windows Forms

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut [C#] tester Fenetre déja ouverte?
    Bonjour,

    Dans une Application MDI j'ai une menu qui permet d'ouvrir un certain nombre de fenetre filles de la fenetre MDI parente.

    Pour l'ouverture d'une des fenetre filles j'utilise le code suivant sur l'evenement click des elements du menu.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private void articlesToolStripMenuItem_Click(object sender, EventArgs e)
            {
                frm_articles FRM_ARTICLES = new frm_articles();
                FRM_ARTICLES.MdiParent = frm_main.ActiveForm;
                FRM_ARTICLES.Show();
     
            }
    L'ouverture marche correctement, par contre si je clique une deuxieme fois sur le meme element du menu cela m'ouvre une deuxieme fenetre identique. Vous me direz c'est normal vu que je fais a chaque fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    frm_articles FRM_ARTICLES = new frm_articles();
    Ma question est donc comment faire en sorte que lorsque la fenetre est déja ouverte on ne puisse pas l'ouvrir une deuxieme fois.

    Merci d'avance.

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 54
    Points : 55
    Points
    55
    Par défaut
    moi j'ai fais ceci ca fonctionne mais je pense qu'il ya mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
                 try
                {
                    Form fr = this.ActiveMdiChild;
     
                    if (fr != null)
     
                        fr.Close();
     
     
                    FrmArticles frmArticle = new FrmArticles(dsjac);
     
     
                    frmArticle.MdiParent = this;
     
                    frmArticle.Show();
     
                }

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private frm_articles FRM_ARTICLES = null;
     
    private void articlesToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if ( FRM_ARTICLES == null)
               {
                    FRM_ARTICLES = new frm_articles();
                    FRM_ARTICLES.MdiParent = frm_main.ActiveForm;
                    FRM_ARTICLES.Show();
                }
            }

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Merci Morpheus, ca marche par contre une fois que j'ai fermer ma fenetre fille, impossible de la réouvrir ...

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 54
    Points : 55
    Points
    55
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    private frm_articles FRM_ARTICLES = null;
     
    private void articlesToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if ( FRM_ARTICLES == null)
               {
                    FRM_ARTICLES_= new frm_articles();
                    FRM_ARTICLES.MdiParent = frm_main.ActiveForm;
                   FRM_ARTICLES..Disposed += new EventHandler(FRM_ARTICLES._Disposed);
                    FRM_ARTICLES.Show();
                }
            } 
    void FRM_ARTICLES_Disposed(object sender, EventArgs e)
            {
                //FRM_ARTICLES.Dispose();//
     
                FRM_ARTICLES= null;
            }

  6. #6
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    vos méthodes marchent mais j'avoue que je n'aime pas cette technique qui repose sur des variables (une par fenêtre MDI fille). Je trouve ça peu évolutif et lourd puisque chaque ouverture de fille doit tester "sa" variable. Avec déjà un risque de bug sur lequel notre ami est tombé de plein pied du premier coup : l'oublie de remise à null de la variable...

    En réalité, un moyenplus propre et beaucoup plus générique consiste à créer une méthode "OuvrirFille(system.Type classeFille)" qui :
    1/ balaye toutes les fenêtres filles déjà ouverte et teste leur classe vis à vis du paramètre passé,
    2/ qui instancie la classe passée en paramètre

    avec cette méthode, ça marche à tous les coups, c'est propre, évolutif, et si ça marche une fois ça marche toujours.

    un code du genre du suivant par exemple (en supposant que la classe recherchée soit MyChildForm) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    foreach(Form f in this.MdiChildren)
         {
              if(f is MyChildForm)
              {
                   // found it
                   childForm = (MyChildForm) f;
                   break;
              }
         }
     
         if( childForm != null)
         {
              childForm.Show();
              childForm.Focus();
         }
         else
         {
              childForm = new MyChildForm();
              childForm.MdiParent = this;
              childForm.Show();
              childForm.Focus();
         }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par Merlin
    vos méthodes marchent mais j'avoue que je n'aime pas cette technique qui repose sur des variables (une par fenêtre MDI fille).
    Le problème, c'est juste que si on ouvre une fenêtre, c'est le plus souvent pour récupérer des entrées utilisateur.
    Pour ça, c'est plus pratique d'avoir une variable non?
    On ne peut pas faire boire un âne qui n'a pas soif.

  8. #8
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    Citation Envoyé par NicolasG
    Le problème, c'est juste que si on ouvre une fenêtre, c'est le plus souvent pour récupérer des entrées utilisateur.
    Pour ça, c'est plus pratique d'avoir une variable non?
    C'est pas forcément la règle, une fenêtre traite en général ses saisies, sauf certains dialogues (genre saisie d'un login dans une petite fenêtre).

    Mais dans tous les cas créer un couplage entre les fiches est une mauvaise idée, et quand on le fait on doit y réfléchir à deux fois.

    De même, entre la méthode que j'ai proposée et l'autre qui a été débattue dans ce thread, la première fonctionne dans tous les cas sans avoir à connaître toutes les classes des fenêtres filles, l'autre réclame la copie d'un code identique pour chaque classe. Cette dernière créé un coupable fort entre la méthode qui créée les filles et ces dernières alors que la première met en place à l'inverse un découpable fort. Elle est donc préférable.
    Plus les acteurs sont indépendants moins on risque d'avoir du code spaghetti et plus il est facile de le faire évoluer (maintenance corrective et évolutive).
    Dans l'absolu il faut toujours viser quelque chose qui se rapproche du modèle MVC, on est rarement déçu :-)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Je suis entièrement d'accord avec ta position mais si tu regardes attentivement le code proposé par pas05, tu peux remarquer que le handler de dispose qui remet à null la variable de fenêtre fille fait partie de la fenêtre mère.
    L'implémentation de la fenêtre fille ne dépends donc pas du mécanisme de remise à zéro de cette variable.
    Le critère d'indépendance est donc bien rempli.
    On ne peut pas faire boire un âne qui n'a pas soif.

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    moi j'ai toujours utilisé la méthode de Merlin qui me semble la plus logique.
    en VB.Net pour ceux qui veulent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        Private Sub MNUDossiers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MNUDossiers.Click
            Dim Frm As Form
     
            For Each Frm In Me.MdiChildren
                If TypeOf Frm Is frmAccueilDossier Then
                    If Frm.WindowState = FormWindowState.Minimized Then
                        Frm.WindowState = FormWindowState.Normal
                    End If
                    Frm.Activate()
                    Exit Sub
                End If
            Next
     
            Dim f As New frmAccueilDossier
     
            '    f.Initialiser(oMesDonnees)
            f.MdiParent = Me
            f.Show()
        End Sub
    la ligne commentaire me permet d'initialiser ma fenetre (datagrid etc.) avec mon dataset

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Ok merci a tous, je vais essayer toutes vos propositions et choisir celle qui me convient le mieux.

  12. #12
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Ayant eu le meme soucis, voici la solution qui m a été proposée et qui me conviens

    a++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
            private void mListeFilms_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
            {
                Boolean bOpen = false;
                foreach (Form f in Application.OpenForms)
                {
                    if (f.Name == "FFilmsListe")
                    {
                      // MessageBox.Show("oui");
                        bOpen = false;
                    }
                    else
                    {
                        bOpen = true;
                    }
                }
     
                if (bOpen == true)
                {
                    FFilmsListe aFFilmsListe = new FFilmsListe(this);
                    // Affichage de la fenetre
                    aFFilmsListe.Show();
                }
     
            }
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  13. #13
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Et pourquoi pas ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    sealed class frm_articles : Form {
      private static frm_articles myInstance = null;
     
      private frm_articles(){
        InitializeComponent();
      }
     
      public static void Display(Form parent){
        if(myInstance == null){
          myInstance = new frm_articles();
          myInstance.MdiParent = parent.ActiveForm;
          myInstance.Show();
        }
      }
      private void frm_articles_FormClosed(object sender,FormClosedEventArgs e){
        myInstance = null;
      }
    }
     
    private void articlesToolStripMenuItem_Click(object sender, EventArgs e)
    {
      frm_articles.Display(frm_main);
    }

  14. #14
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Car je ne suis pas en MDI

    je docke ma fenetres dans un panel, et donc je ne dois pas l ouvrir plusieurs fois

    a++
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  15. #15
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Ben avec ce code là, tu ne l'ouvres qu'une fois... Singleton-like.

Discussions similaires

  1. Instance déja ouverte
    Par jagboys dans le forum MFC
    Réponses: 4
    Dernier message: 09/09/2006, 00h06
  2. Réponses: 7
    Dernier message: 18/04/2006, 19h29
  3. [VB]donner le focus à une application déja ouverte ou fermée
    Par Nicko29 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 21/01/2006, 14h28
  4. [Swing] comment savoir si une fenetre est ouverte ?
    Par uraxyd dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 31/12/2005, 11h55
  5. tester si fichier ouvert
    Par nbelg27 dans le forum Access
    Réponses: 6
    Dernier message: 08/09/2005, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo