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 :

Rafraîchissement via DataSource_ListChanged


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Points : 18
    Points
    18
    Par défaut Rafraîchissement via DataSource_ListChanged
    J'ai créé une Classe IPropertyChanged nommée MaClasse. Elle contient les champs suivants:Id, NbrHour, TimeRate, TotalPrice, Weight, TotalPriceByWieght.

    Cette classe est liée à un BindingSource ainsi qu'a des TextBox. Lorsque je modifie par exemple NbrHour, je veux calculer le
    TotalPrice = (NbrHour * TimeRate) et TotalPriceByWieght = (TotalPrice / Weight)

    Pour cela, j'utilise l'évènement ListChanged du BindingSource pour être averti que j'ai effectué une modification. Et donc dans cette méthode, j'appel le calcul de mes deux champs. Et la je constate que le rafraichissement de mes contrôles TextBox est décalé. C'est à dire qu'il affiche la valeur du précédent calcul.

    Maintenant, si je met ma logique de calcul dans la propriété NbrHour de ma classe puis que je déclenche les INotifyPropertyChanged, mes contrôles se mettent correctement à jour. Mais je pense que ce n'est pas la solution. Car je voudrai pouvoir travailler avec des classes Model contenant que la structure de ma base de données et une autre classe BLL contenant tout la logique pour la classe Model.

    Je vous ai mis un mini projet en annexe pour que vous puissiez tester.

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Plutôt que de faire le calcul de TotalPrice et TotalPriceByWeight dans la Form, fais le plutôt directement dans ta classe :

    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
        public decimal TotalPrice
        {
            get { return NbrHour * TimeRate; }
        }
     
        public decimal TotalPriceByWeight
        {
            get
            {
                if(Weight == 0)
                    return 0;
                else
                    return TotalPrice / Weight;
            }
        }
    Et pour avoir les notifications de changement, appelle OnPropertyChanged sur ces propriétés quand tu modifies les propriétés dont elles dépendent :

    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
        public int NbrHour
        {
            get { return m_NbrHour; }
            set
            {
                if (m_NbrHour != value)
                {
                    m_NbrHour = value;
                    OnPropertyChanged("NbrHour");
                    OnPropertyChanged("TotalPrice");
                    OnPropertyChanged("TotalPriceByWeight");
                }
            }
        }
     
        public decimal TimeRate
        {
            get { return m_TimeRate; }
            set
            {
                if (m_TimeRate != value)
                {
                    m_TimeRate = value;
                    OnPropertyChanged("TimeRate");
                    OnPropertyChanged("TotalPrice");
                    OnPropertyChanged("TotalPriceByWeight");
                }
            }
        }
     
        public decimal Weight
        {
          get { return m_Weight; }
          set
          {
            if (m_Weight != value)
            {
              m_Weight = value;
              OnPropertyChanged("Weight");
              OnPropertyChanged("TotalPriceByWeight");
            }
          }
        }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Pas mal votre solution. Mais elle ne marche que si je veux mettre à jour des champs de la même classe. Car je pourrai avoir la situation suivante:

    Poste de commande Quantité * Prix unitaire --> Calcul du prix Total (comme vous l'avez spécifié) puis
    Directement sur cet évènement mettre à jour ma classe En-tête de commande avec le Prix total de tous les postes.

    Avez-vous une idée ?

  4. #4
    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 Polarisdg Voir le message
    Pas mal votre solution. Mais elle ne marche que si je veux mettre à jour des champs de la même classe. Car je pourrai avoir la situation suivante:

    Poste de commande Quantité * Prix unitaire --> Calcul du prix Total (comme vous l'avez spécifié) puis
    Directement sur cet évènement mettre à jour ma classe En-tête de commande avec le Prix total de tous les postes.

    Avez-vous une idée ?
    Pour ce genre de choses, le plus simple est d'utiliser un DataSet... ça permet d'établir des relations entre les tables, et de définir des colonnes calculées en fonction d'autres colonnes, où en fonction des données des tables enfants (ou parents)

    Par exemple, s'il y a 2 tables EnTeteCommande et DetailCommande, avec une relation EnTeteCommande_DetailCommande entre les 2 (c'est le nom par défaut) :
    - le champ Total d'une ligne de commande serait défini avec l'expression suivante : "Quantité * Prix Unitaire"
    - le champ Total de l'en-tête serait défini avec l'expression suivante : "Sum(Child(EnTeteCommande_DetailCommande).Total)"

    La modification d'un champ entraîne automatiquement le recalcul des colonnes qui en dépendent.

    Sinon, il reste bien sûr possible de faire ça avec des objet "normaux", mais c'est un peu plus galère... par exemple la classe EnTeteCommande pourrait contenir une collection de DetailCommande, et s'abonner à l'évènement PropertyChanged de chaque DetailCommande pour détecter les changements et se mettre à jour si besoin

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

Discussions similaires

  1. [window.setTimeout] rafraîchissement via une donnée variable
    Par Herwan dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/06/2013, 20h16
  2. [PHP 5.4] Problème de rafraîchissement d'une page via $_SESSION
    Par Joffrey H dans le forum Langage
    Réponses: 1
    Dernier message: 08/02/2013, 05h47
  3. Réponses: 5
    Dernier message: 13/05/2008, 16h57
  4. [Kylix] PostgreSql via ODBC
    Par doykati dans le forum EDI
    Réponses: 3
    Dernier message: 08/02/2007, 10h10
  5. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09

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