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

C# Discussion :

Faire remonter l'argument d'un Event


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 43
    Par défaut Faire remonter l'argument d'un Event
    Bonjour,

    La methode suivante appartient à la classe "Connexion" elle est appellée depuis une autre classe "Résultat".
    J'aimerai faire remonter dans la classe "Résultat" l'argument e de type DownloadStringCompletedEventArgs car c'est lui qui contient mon objet XML que je traite dans cette classe.

    Comment m'y prendre ?

    Merci d'avance


    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
     
    public void DownloadAsync(string password, string user, string domain, string critere)
            {
                WebClient client = new WebClient();
     
                client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
     
                client.Credentials = new NetworkCredential(user, password, domain);
     
     
                    client.DownloadStringAsync(new Uri(URL_RECHERCHE + critere));
     
            }
     
            void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                if (e.Error != null)
                {
                    MessageBox.Show("Erreur : " + e.Error.Message);
                    return; // A faire : gérer l'erreur.
                }
     
            }

  2. #2
    Membre éprouvé Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Par défaut
    Il faut que tu crée un délégué dans ta classe "Connexion" qui sera implémenté dans ta classe "Résultat".

    Voici un exemple, dans ta classe "Connexion", déclare un événement et un délégué public :

    public delegate void m_dlgt_Client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e);
    public event m_dlgt_Client_DownloadStringCompleted m_evt_Client_DownloadStringCompleted;
    Puis lève l’événement dans 'client_DownloadStringCompleted'

    void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
    if (e.Error != null)
    {
    MessageBox.Show("Erreur : " + e.Error.Message);
    return; // A faire : gérer l'erreur.
    }

    if (m_evt_Client_DownloadStringCompleted != null)
    m_evt_Client_DownloadStringCompleted.Invoke(sender, e);


    }
    Il faut tu ai géré l’événement dans ta classe Résultat. Lorsque tu vas instancier ton objet "Connexion", abonne toi à l'événement 'm_evt_Client_DownloadStringCompleted' de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjetConnexion.m_evt_Client_DownloadStringCompleted += m_evt_Client_DownloadStringCompleted;
    Tu pourras ensuite avoir accès comme tu veux aux données de l’événement DownloadStringCompletedEventArgs levé dans 'Connexion'.

    J’espère avoir été assez clair dans mon explication. :D

  3. #3
    Membre averti
    Inscrit en
    Janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 43
    Par défaut
    Ouah merci de ta réponse déjà mais j'ai essayé de comprendre les deleguate et les events...c'est un gros morceau...

    J'ai un souci avec la dernier bout de code.
    Qui s'abonne à quoi là ?
    Le "m_evt_Client_DownloadStringCompleted" à droite de "+=" il correspond à quoi ?

    Je n'ai pas accès à cet objet depuis la classe "resultat"..

    EDIT:

    C'est bon j'ai compris , c'est la fonction que je veux exécuter quand l'event se déclenche...
    Le souci c'est que mon event devient null quand le debug passe dans la classe connexion alors que je l'ai incrémenter dans la classse résultat avant.
    Donc à l'invoke ça ne passe pas ...Je sais pas si je suis clair...

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    C'est ton objet de connexion qui s'abonne à l'évenement m_evt_Client_DownloadStringCompleted grâce au mécanisme de délégués.

    Le += n'est qu'un raccourci de syntaxe : "a+=b" équivaut à "a = a + b"

  5. #5
    Membre éprouvé Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Par défaut
    Bonjour,

    Tu as sur Développez.com, deux très bon cours sur les délégués :

    - Introduction aux délégués en C#
    - Délégués et évènements

    Ce qu'il faut comprendre là, c'est que :

    - On a déclaré un évènement dans la classe Connexion avec un délégué.
    - Dans ta classe Résultat tu signifies, par le code ci-dessous, que tu veux gérer l’événement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjetConnexion.m_evt_Client_DownloadStringCompleted += m_evt_Client_DownloadStringCompleted;
    - Ce qui fait qu'à chaque fois que l'évènement va être levé dans ta classe Connexion, il remontera jusque dans ta classe 'Resultat'.

    Un exemple :

    - Imaginons que tu mets une TextBox dans un Winform.
    - A chaque fois que tu changes le texte de la TextBox, l’événement 'TextChanged' est levé peu importe qu'il soit géré ou non par le formulaire.
    - Si tu veux gérer le changement de texte, tu vas 'implémenter' explicitement l’événement dans ta Form.


    C'est pareil dans ton cas.

    Citation Envoyé par OhKerod Voir le message
    Je n'ai pas accès à cet objet depuis la classe "resultat"..
    EDIT:

    Je n'avais pas vu ça.
    Est-ce que tu crée un objet 'Connexion' dans ta classe Résultat ? Comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connexion l_Connexion = new Connexion();
    Si tu veux pouvoir gérer l’événement, il faut que tu le fasses. Ca devrait te donner un truc dans ce genre là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Connexion l_Connexion = new Connexion();
    l_Connexion.m_evt_Client_DownloadStringCompleted += m_evt_Client_DownloadStringCompleted;
    Ce qui devrait te créer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        private void l_Connexion_evt_Client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
          // TON CODE
        }

  6. #6
    Membre averti
    Inscrit en
    Janvier 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 43
    Par défaut
    En fait moi j'ai donné le nom d'une methode que je souhaite exécuter après qu'il est levé l'evenement...
    Est ce que ça change quelque chose ? (c'est pas lui qui la créer automatiquement)

    j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     _connexion=new Connexion.Connexion();
                   _connexion.m_evt_Client_DownloadStringCompleted += Get_Downloaded_Object;
     
     
            private void Get_Downloaded_Object(object sender, DownloadStringCompletedEventArgs e)
            {
                TraitementDuXml(e.Result);
     
            }
    Mais le souci comme je disais plus haut c'est que l'event est toujours à null dans la classe connexion ...je l'incrémente dans la classe résultat et quand le debug va dans la classe connexion il revient à null..donc pas d'invoke possible...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/06/2007, 17h47
  2. Exception, problème pour la faire remonter.
    Par Djobird dans le forum Langage
    Réponses: 12
    Dernier message: 18/05/2007, 10h35
  3. Faire passer des arguments via window.open()
    Par juanqui dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/02/2007, 19h27
  4. 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, 17h37
  5. Réponses: 17
    Dernier message: 04/02/2005, 12h05

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