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 :

Créé un evenement lancé lors de la modification de valeur d'une variable


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut Créé un evenement lancé lors de la modification de valeur d'une variable
    Bonjour, j'ai réalisé un petit projet n-tiers.
    J'ai dans 1 couche des variables qui sont modifiées (dans une classe statique). Je voudrais que lorsqu'une de ces variables voit sa valeur changée cela déclenche un evenement, auquel les classes de niveau supérieur puisse 's'abonner' et qu'il déclenche des méthode dans ces dites classes. Pour généré un affichage par exemple.
    Est ce possible ?

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Oui bien sur. Tu déclenche ton événement dans la définition de l'accesseur set lorsque tu change la valeur propriété du champ par sa propriété.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ce qui suppose que ce soit des propriétés et non des simples champs, bien sûr...
    Une façon propre de faire ça est d'implémenter l'interface INotifyPropertyChanged. Elle définit juste un évènement PropertyChanged que tu dois déclencher quand la propriété est modifiée.

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    En même temps, l'accès à un champ devrait se faire très souvent via une propriété. Par ocntre j'avais oublié l'interface En plus c'est utilisé avec LINQ to SQL

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par harz62 Voir le message
    En plus c'est utilisé avec LINQ to SQL
    Oui, mais elle existait déjà en 2.0... c'est pas spécifique à LINQ

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    C'était juste une précision ^^ Il me semble d'ailleurs que cette interface est utilisé par le databinding...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    et une autre classe du projet, n'appartenant pas au meme namespace sera notifié de l'evenement ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Yogy Voir le message
    et une autre classe du projet, n'appartenant pas au meme namespace sera notifié de l'evenement ?
    Si elle s'abonne à l'évènement, oui

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Oui au début je parlais de variables mais je pensais à des propriétés bien sur. Je vais faire une recherche avec INotifyPropertyChanged

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Je n'arrive pas à abonner ma méthode dans ma classe qui est sensée afficher le changement de valeur.
    Voici ma classe qui a une propriété . Ma classe 'affichage' doit donc afficher les valeurs de cette propriété :
    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 class CommMessages : INotifyPropertyChanged
        {
            private string _message;
            public string Message
            {
                get { return _message; }
                set
                {
                    if (_message != value)
                    {
                        _message = value;
                        DoPropertyChanged("Message");
                    }
                }
            }
            #region INotifyPropertyChanged Members
            protected void DoPropertyChanged(string propName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
            public event PropertyChangedEventHandler PropertyChanged;
            #endregion

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Dans la classe qui s'abonne à l'évènement, tu crées une méthode avec la même signature que le delegate PropertyChangedEventHandler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void monObjet_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName = "Message")
        {
            ...
        }
    }
    Et tu t'abonnes à l'évènement en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet.PropertyChanged += monObjet_PropertyChanged;

  12. #12
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Sinon si on ne veut pas créer de méthode on peut faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    monObjet.PropertyChanged += delegate(objet sender,PropertyChangedEventArgs e)
    {
         if (e.PropertyName == "Message")
        {
            ...
        }
     
    };
    Ou en C#3.0:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monObjet.PropertyChanged += (sender, e) => { if(e.PropertyName == "Message") { ... } };

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Merci pour toutes vos infos !!
    mais mon soucis maintenant c'est que je voulais que ma variable message soit statique. Car je la veut accessible depuis plusieures classes.
    Or apperement une classe statique ne peut pas implémenter d'interface. Donc je suis dans l'impasse avec mon "INotifyPropertyChanged"

  14. #14
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Yogy Voir le message
    Merci pour toutes vos infos !!
    mais mon soucis maintenant c'est que je voulais que ma variable message soit statique. Car je la veut accessible depuis plusieures classes.
    Or apperement une classe statique ne peut pas implémenter d'interface. Donc je suis dans l'impasse avec mon "INotifyPropertyChanged"
    Utilise un singleton alors.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Merci pour l'info! je progresse....
    j'ai un autre soucis maintenant, c'est que lorsque le programme arrive ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                private void NotifyPropertyChanged(String info)
                {
                    if (PropertyChanged != null)
                    {
                     PropertyChanged(this, new PropertyChangedEventArgs(info));
                    }
                }
    PropertyChanged est toujours null.
    Pourtant dans un autre sous projet de ma solution je me suis abonné comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CommMessages.Instance.PropertyChanged +=new PropertyChangedEventHandler(Instance_PropertyChanged);
    d'ou peut venir mon probleme ?

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Yogy Voir le message
    PropertyChanged est toujours null.
    Pourtant dans un autre sous projet de ma solution je me suis abonné comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CommMessages.Instance.PropertyChanged +=new PropertyChangedEventHandler(Instance_PropertyChanged);
    d'ou peut venir mon probleme ?
    Tu es sûr que ce code est bien exécuté ? Tu l'as mis dans le constructeur de la classe qui consomme l'évènement ?

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Oui il est dans le constructeur de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            public Console()
            {
                InitializeComponent();
                CommMessages.Instance.PropertyChanged +=new PropertyChangedEventHandler(Instance_PropertyChanged);
     
            }
    j'ai mis un breakpoint dessus et il s'arrete bien à cet endroit là.
    Je rajoute le code complet de ma classe singleton :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
       public class CommMessages : INotifyPropertyChanged
        {
            private string _message;
            private static CommMessages _Instance;
            private static object _InstanceLocker = new object();
     
                #region property changed
            public event PropertyChangedEventHandler PropertyChanged;
           /* {
                add { }
                remove { }
            }*/
     
            private void NotifyPropertyChanged(String info)
                {
                    if (CommMessages.Instance.PropertyChanged != null)
                    {
                        CommMessages.Instance.PropertyChanged(this, new PropertyChangedEventArgs(info));
                    }
                }
                #endregion
     
            public static CommMessages Instance
            {
               get
                {
                    lock (_InstanceLocker)
                    {
                        if (_Instance == null)
                        {
                            _Instance = new CommMessages();
                        }
                        return _Instance;
                    }
                }
            }
     
            public string Message
            {
                get {return CommMessages.Instance._message;}
                set
                {
                    CommMessages.Instance._message = value;
                    NotifyPropertyChanged("Message");
                }
            }
     
        }
     
     
     
    }

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bizarre, je comprends pas trop... tu as mis un breakpoint dans le code du set de la propriété ?

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    J'ai mis mon breakpoint ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CommMessages.Instance.PropertyChanged +=new PropertyChangedEventHandler(Instance_PropertyChanged);
    Et après une exécution pas à pas je vois qu'à la suite de ce breakpoint qu'il parcourt les lignes suivantes de mon singleton de ma classe CommMessages.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
               get
                {
                    lock (_InstanceLocker)
                    {
                        if (_Instance == null)
                        {
                            _Instance = new CommMessages();
                        }
                        return _Instance;
                    }
                }
    D'ailleurs j'ai du mal à voir le mien entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public event PropertyChangedEventHandler PropertyChanged;
    de ma classe singleton CommMessages
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NotifyPropertyChanged("Message");
    de ma propriété Message de cette même classe.

    Je récapitule un truc car je me demande si j'ai mis au bon endroit mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CommMessages.Instance.PropertyChanged +=new PropertyChangedEventHandler(Instance_PropertyChanged);
    J'ai une classe console qui doit afficher toutes les modifs de ma propriété Message de ma classe CommMessages.
    Dans le constructeur de ma classe console j'ai mis le code juste ci-dessus pour m'abonner à l'evenement.
    Mais j'ai l'impression que ce n'est pas pris en compte. (non?) est ce la faute de mon singleton qui serai mal fichu ?

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Yogy Voir le message
    est ce la faute de mon singleton qui serai mal fichu ?
    Tu es sûr qu'il n'y a pas une autre instance de CommMessages quelque part ? pour être sûr que ça n'arrive pas, déclare un constructeur privé sans paramètres pour qu'on ne puisse pas créer un instance explicitement avec un "new". Il me semble qu'à part ça le pattern singleton est correctement implémenté, si ce n'est pas ça je ne vois pas trop où est le problème...

Discussions similaires

  1. Modification des valeurs d'une liste déroulante
    Par edogawa dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/01/2008, 20h12
  2. Réponses: 20
    Dernier message: 03/04/2007, 16h45
  3. Réponses: 2
    Dernier message: 11/07/2006, 12h02
  4. [c#]Modifer la valeur d'une DataGrid
    Par guillaume16 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/05/2006, 16h21
  5. [VB6]Modification de valeurs dans une MSflexgrid
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 14/02/2006, 08h48

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