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#]Remonter des événements dans des classes imbriquées


Sujet :

Windows Forms

  1. #1
    Membre confirmé Avatar de Kcirtap
    Inscrit en
    Juillet 2005
    Messages
    553
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 553
    Points : 523
    Points
    523
    Par défaut [C#]Remonter des événements dans des classes imbriquées
    Bonjour,

    je suis toujours face à des problèmes pour faire remonter des événements parmi des classes imbriquées.

    J'ai de nouveau fait un petit schéma pour essayer d'être plus clair.



    Ma classe Form instancie l'objet singleton Facade.
    Cet objet est le "système nerveux" de l'application et est censé pouvoir faciliter la réutilisation du code pour une autre application.

    A son tour, l'objet Facade instancie un objet DbManager chargé de gérer les connexions à la base de données et la persistance.

    Je dois faire état d'un chargement d'une liste d'objets par la ProgressBar de ma Form.
    Pour ce faire, je déclenche un événement dans uneMéthode().

    Comment puis-je faire pour abonner un méthode de ma Form à l'événement :

    J'ai bien tenté de ramener mon événement au niveau de ma Form par un accesseur dans la Facade, mais je n'y suis pas parvenu. Cela me pose des problèmes lorsque je fait un += dans ma Form.

    Quelqu'un verrait une solution :

  2. #2
    Membre confirmé Avatar de Kcirtap
    Inscrit en
    Juillet 2005
    Messages
    553
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 553
    Points : 523
    Points
    523
    Par défaut Re: [C#]Remonter des événements dans des classes imbriquées
    Citation Envoyé par Kcirtap
    J'ai bien tenté de ramener mon événement au niveau de ma Form par un accesseur dans la Facade, mais je n'y suis pas parvenu.
    Suivant les cas, j'ai le message suivant
    Citation Envoyé par VS .NET
    L'événement 'ch.gm.nova.gdpm.controllers.DbManager.progression' ne peut apparaître qu'à gauche de += ou -= (sauf en cas d'utilisation à partir du type 'controllers.DbManager')
    qui provient de l'accesseur.

  3. #3
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Ben je vois pas trop le souci mais j'ai peut être pas tout suivi
    Voilà comment j'ai testé à partir de ton architecture:

    DbManager:
    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
     
    using System;
    using System.Timers;
     
    namespace TestsEvents
    {
       public delegate void ProgressEventHandler(string s);
       class DbManager
        {
          public event ProgressEventHandler p;
          private Timer t;
          public DbManager()
           {
              this.t = new Timer(Convert.ToDouble(1000));
              this.t.Elapsed += new ElapsedEventHandler(this.t_Elapsed);
              this.t.Start();
           }
          private void uneMethode()
           {this.p("coucou");}
          private void t_Elapsed(object sender, ElapsedEventArgs e)
            {this.uneMethode();}
        }
    }
    Facade:
    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
     
    using System;
     
    namespace TestsEvents
    {
      public class Facade
      {
         private DbManager dbm;
         public event ProgressEventHandler CaptureProgress;
         public Facade()
         {
            this.dbm = new DbManager();
           this.dbm.p += new ProgressEventHandler(this.CaptureProgressEvent);
         }
         private void CaptureProgressEvent(string s)
         {this.CaptureProgress(s);}
      }
    }
    Form1:
    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
     
    private Facade f;
    private Label label1;
    private ProgressBar progressBar1;
    private int counter;
    private void Form1_Load(object sender, EventArgs e)
     {
       this.counter = 0;
       this.f = new Facade();
       this.f.CaptureProgress += new ProgressEventHandler(f_CaptureProgress);
     }
    private void f_CaptureProgress(string s)
     {
       this.counter += 1;
       string texte = s + this.counter.ToString();
       this.label1.Text = texte;
       this.progressBar1.PerformStep();
     }
    Aucun souci , çà fonctionne
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  4. #4
    Membre confirmé Avatar de Kcirtap
    Inscrit en
    Juillet 2005
    Messages
    553
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 553
    Points : 523
    Points
    523
    Par défaut
    Effectivement, cela fonctionne.

    Un grand à toi pour le temps que tu as pris pour me répondre.

    J'aimerai pouvoir te rendre les mêmes services.
    Ou à défaut te faire parvenir de bons chocolats pour Noël.

    Bonne journée

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Kcirtap
    Effectivement, cela fonctionne.

    Un grand à toi pour le temps que tu as pris pour me répondre.

    J'aimerai pouvoir te rendre les mêmes services.
    Ou à défaut te faire parvenir de bons chocolats pour Noël.

    Bonne journée
    ben tu sais les chocolats çà ne manque pas ici
    mais t'inquiètes j'accepte les Francs suisses
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Membre confirmé Avatar de Kcirtap
    Inscrit en
    Juillet 2005
    Messages
    553
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 553
    Points : 523
    Points
    523
    Par défaut Une dernière question
    Citation Envoyé par neguib
    ben tu sais les chocolats çà ne manque pas ici
    mais t'inquiètes j'accepte les Francs suisses
    Il est plus facile pour moi de trouver du chocolat que des francs suisses.

    J'ai une dernière question.

    Mon DbManager est une classe abstraite qu'implémentent un DbManagerSql (pour SQL Server) et un DbManagerOle.
    J'ai mis mon événement dans DbManager. Il est déclenché par des méthodes commune aux deux DbManager spécifiques (opérations sur un Dataset).

    Cependant, lorsque j'essaie de déclencher l'événement 'p' du DbManager depuis l'un des deux DbManager spécifiques, j'obtiens une erreur (celle citée au début du post).

    Y a-t-il une possibilité de déclencher l'événement de la classe mère :

  7. #7
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Petites modif qui fonctionnent egalement

    DbManager:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    using System;
     
    namespace TestsEvents
    {
       public delegate void ProgressEventHandler(string s);
       public abstract class DbManager
        {
           public event ProgressEventHandler p;
           public void OnProgressEvent( string s)
            {this.p(s);}
        }
    }
    SqlDbManager:
    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
     
    using System;
    using System.Timers;
     
    namespace TestsEvents
    {
      public class SqlDbManager : DbManager
       {
         private Timer t;
         public SqlDbManager()
          {
            this.t = new Timer(Convert.ToDouble(1000));
            this.t.Elapsed += new ElapsedEventHandler(this.uneMethode);
            this.t.Start();
          }
         private void uneMethode(object sender, ElapsedEventArgs e)
          {base.OnProgressEvent("coucou");}
       }
    }
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  8. #8
    Membre confirmé Avatar de Kcirtap
    Inscrit en
    Juillet 2005
    Messages
    553
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 553
    Points : 523
    Points
    523
    Par défaut
    Je n'avais pas pensé à lancer l'événement depuis une méthode de la classe abstraite.

    Encore merci beaucoup.

    Patrick

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    cf ça donc :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 21
    Points : 8
    Points
    8
    Par défaut
    Même 8 ans après, une discussion peut servir.
    1000 mercis

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

Discussions similaires

  1. Comment ajouter des séries dans des graphes sur des feuilles variables
    Par Molomarcopolo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 17h26
  2. Définir des événements dans une classe
    Par Masmeta dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/04/2008, 18h41
  3. Faire "remonter" les données dans des requetes imbriquées
    Par Earthwormjim dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/08/2006, 18h37
  4. Réponses: 2
    Dernier message: 27/03/2005, 17h09

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