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

Dotnet Discussion :

Comment implémenter MVP avec plusieurs Winforms


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut Comment implémenter MVP avec plusieurs Winforms
    Bonjour,

    Cela fait quelques temps que je réfléchis sur la façon d'implémenter MVP avec plusieurs winforms.

    J'ai un winform de connection et un winform principal en MDI.
    Je considère, suivant le modele MVP, que le presenteur doit être le "point d'entrée". Ce qui signifie que c'est dans sa méthode Start() que la vue qui lui est associée doit s'afficher.

    Mais la méthode Show() des Winforms n'est pas "bloquante". Donc quand mon présenter demande l'affichage de sa vue, le winform s'ouvre et se ferme immédiatement.


    Pour contourner ce problème, j'ai tenté l'utilisation d'un ApplicationContext, mais c'est exactement la même chose, le winform s'ouvre et se ferme immédiatement, en revanche l'application n'est pas terminée car le thread d'affichage, géré par l'applicationContext, tourne toujours en affichant... rien du tout.


    Comment faites-vous pour palier à ce maudit problème?

    Suis-je contraint de passer par la méthode ShowDialog()?

    N'y a-t-il pas la possibilité de gérer cela par un ApplicationContext customisé? ou tout autre moyen?

    Merci de vos conseils.

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour touftouf57

    Il faut garder la pompe des messages ou boucle des messages habituelle s'executant indefiniment (Application.Run() sans parametre)...

    Cela permet d'afficher tes forms "modeless"....

    Prendre en charge toi -meme la gestion de l'objet Application...
    Sortie de l'appli sera geree par ton presenter , par appel à Application.ExitThread (sortie de l'app)...

    cela necessitera de modifier programm.cs.....

    code .cs class presenter:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public class Presenter
        {
             private MainForm frmMain = new MainForm();
             private SecondaryForm frmSecondary = new SecondaryForm();
             public Presenter()
             {
             }
     
     
             public void Start()
             { 
                //  Show both windows modelessly at the same time.
                // The user can use both of them.
     
                frmMain.Show();
                frmSecondary.Show();
                frmMain.ExitPresenter += new EventHandler(EndApp);
     
     
             }
     
             private void EndApp(object sender, EventArgs e)
             {
                 Application.ExitThread ();
             }
     
     
         }
    }
    code .cs program:
    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
    25
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Presenter present  = new Presenter();
                present.Start();
                Application.Run();
     
            }
        }
    }
    code du form principal (qui a la charge de notifier le presenter de fermer l'application des qu'on le ferme -event closed -:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class MainForm : Form
        {
            // cet event servira à notifier le presenter 
            // de quitter l'application courante 
            public event EventHandler ExitPresenter;
            public MainForm()
            {
                InitializeComponent();
                this.Text = "MainForm";
                this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);
            }
     
            void MainForm_FormClosed(object sender, FormClosedEventArgs e)
            {
                RaiseExitPresenter();
            }
     
     
            public void RaiseExitPresenter()
            {
                EventHandler h = ExitPresenter;
                if (h != null) h(this, EventArgs.Empty);
            }
     
        }
    }
    code d'un autre form (qui illustre la possibilite de gerer plusieurs forms ouverts simultantement):
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class SecondaryForm : Form
        {
            public SecondaryForm()
            {
                InitializeComponent();
                this.Text = "SecondaryForm";
            }
        }
    }
    Bon code...

  3. #3
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Merci de cette réponse tardive.

    Je me pencherais sur ta solution demain en arrivant au bureau. Merci et bonne nuit.

  4. #4
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Un grand MERCI mabrouki.

    C'est exactement ce qu'il me fallait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    presenter.Start();
    Application.Run();
    Je ne savais pas que cela fonctionnait de la sorte.
    Je ne l'avais jamais tenté, car je pensais qu'il fallait forcément fournir un Form ou ApplicationContext à Application.Run

    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment avoir Listbox avec plusieurs colonnes
    Par pseudo88 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 20/05/2010, 10h45
  2. Comment utiliser FMod avec plusieurs cartes sons?
    Par NJKMASTER dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/11/2007, 11h43
  3. Réponses: 6
    Dernier message: 30/06/2006, 00h09
  4. Comment comparer un texte avec plusieurs apostrophes
    Par electrosat03 dans le forum Access
    Réponses: 2
    Dernier message: 13/02/2006, 12h46
  5. [linux][gcc] Comment travaille t-on avec plusieurs fichiers?
    Par kaygee dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 02/04/2004, 17h48

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