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#] Détecter les changemens d'un élément (CollectionBase)


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut [C#] Détecter les changemens d'un élément (CollectionBase)
    Bonjour.

    J'ai conçu une classe de collection de produits. Elle dérive de CollectionBase.

    Chaque produit possède un ID et il doit être unique à travers la collection.
    J'ai ajouté la méthode this[index] = ... (utile pour remplacer des produits). Lorsque cette dernière est utilisé je peux intercepter le changement à l'aide de l'événement : OnSet (où je valide le remplacement à savoir si le nouveau ID n'est pas déjà présent dans la collection)

    Cependant, l'utilisateur pourrais aussi faire

    myProductCol[0].ID = 10

    Comment pourrais-je détecter ce changement de valeur et le valider si le ID 10 n'existe pas déjà ???

    Merci.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut
    Pourquoi n'utilises-tu pas un hashtable?

    Pourquoi permets-tu de changer l'id d'un produit?

    Tu pourrais lorsque le client a ajouter un produit à la liste, avoir un friend (internal en C#) property (flag ou référence sur le parent) dans la classe Produit qui est setté et lors de l'assignation d'un nouveau Id, vérifier cette friend propriété et voir si permet modifier (le flag - raiser une exception ou ne rien faire?) ou voir si id déjà dans collection du parent (et raiser une exception ou ne rien faire?).


    L'accessor this[] dans CollectionBase n'existe pas. Tu as dû l'ajouter dans ta classe dérivée. Pourquoi utiliser l'événement OnSet alors que tu peux controller les modifications par toi-même?

    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
    public Produit this[int index]
    {
      get
      {
        return null;
      }
      set
      {
        //vérifier que le value reçu != null && que l'id n'est pas déjà présent
        //un genre de 
        //if(!exists(value))
        //setter la valeur
        //else
        //avertir le user ou throw Exception approprié avec message
      }
    }

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Bonjour.

    Citation Envoyé par selfaro
    Pourquoi n'utilises-tu pas un hashtable?

    Pourquoi permets-tu de changer l'id d'un produit?
    Je ne vois pas plus le but d'utiliser une HashTable ? Me semble qu'une collection typée est de loins plus intéressante...

    Ok, supposons que l'on ne permettre pas de changer le ID, mais le nom, description, prix, catégories, etc... du produit. Je ne veux pas non plus qu'un nom du produit se retrouve deux fois dans ma liste. Alors je reviens toute bêtement avec le même problème....

    Citation Envoyé par selfaro
    Tu pourrais lorsque le client a ajouter un produit à la liste, avoir un friend (internal en C#) property (flag ou référence sur le parent) dans la classe Produit qui est setté et lors de l'assignation d'un nouveau Id, vérifier cette friend propriété et voir si permet modifier (le flag - raiser une exception ou ne rien faire?) ou voir si id déjà dans collection du parent (et raiser une exception ou ne rien faire?).
    Intéressant, je vais voir ce que je peux faire bienque je me rappel un peu du fonctionnement des friends sous C++ mais sous C# ? hum....

    Citation Envoyé par selfaro
    L'accessor this[] dans CollectionBase n'existe pas. Tu as dû l'ajouter dans ta classe dérivée. Pourquoi utiliser l'événement OnSet alors que tu peux controller les modifications par toi-même?

    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
    public Produit this[int index]
    {
      get
      {
        return [b](Produit)this.List[index][/b];
      }
      set
      {
        //vérifier que le value reçu != null && que l'id n'est pas déjà présent
        //un genre de 
        //if(!exists(value))
        //setter la valeur
        //else
        //avertir le user ou throw Exception approprié avec message
      }
    }
    Désolé, je me suis mal expliqué, je sais que l'accessor this[] n'est pas définit par CollectionBase. Ce que je voulais dire par-là c'est que cette méthodes est très pratique pour modifier un produits (Web par exemple).

    Merci.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut
    Puisque ce n'est pas juste l'id, mais aussi le nom et autres des produits qui doivent être uniques dans la collection, tu n'auras pas le choix d'avoir pour chaque produit une référence vers la collection le contenant.

    Et lors d'une modification à une propriété d'un produit, valider que la nouvelle valeur est unique dans la collection parente, ou sinon, traiter adéquatement l'exception.

    D'après moi, tu n'auras pas le choix de parcourir chaque produit et de les vérifier un par un.

    La même chose lorsque tu ajoutes un nouveau produit ou lorsque tu utilises this[index] = produit.

    Je ne vois pas de façon super géniale de résoudre ça. Désolé.

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Bonjour,

    Citation Envoyé par selfaro
    avoir pour chaque produit une référence vers la collection le contenant
    Très pratique mais qu'arrive-t-il si ce produit se retrouve dans 2 collections simultannées (le produit ayant la même instance) ?

    Si je retire la méthode this[index] comme je me suis fait proposé et que je laisse seulement l'option d'ajouté (avec constructeur) et supprimé l'item alors j'ai encore un autre problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ProductCollection pc = new ProductCollection();
    Product pr = new Product(...);
    pc.Add (pr);
    pr.ID = 10;    // <-- ID 10 déjà existant !!! PROBLÈME
    Ou encore ça pourrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ProductCollection pc = new ProductCollection();
    Product pr1 = new Product(...);
    Product pr2 = new Product(...);
    Product pr3 = new Product(...);
     
    IEnumerator IE = pc.GetEnumerator();
    while ( IE.MoveNext() )
      ((Product)IE.Current).m_ID == 10;  // <-- ID 10 déjà existant !!! PROBLÈME
    Merci
    Quelqu'un à une solution miracle ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Application)IE.Current).m_ID
    C'est quoi l'affaire????

    Tu typecast un Product en Application pis ça marche?

    m_ID est une donnée membre (public int m_ID) ou une propriété (public int m_ID {get { return this.m_ID; } }) ?

    Si le produit appartient déjà à une collection, alors tu empêches de l'ajouter à une autre (le comportement standant d'un DataRow dans un DataTable).

  7. #7
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Citation Envoyé par selfaro
    C'est quoi l'affaire????

    Tu typecast un Product en Application pis ça marche?
    lol.
    Désolé, je faisais deux trois choses en même temps lorsque j'ai écris ce message et je me suis trompé... Regarde mon message je l'ai (corrigé).

    Définition abrégée d'un produit
    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
     
    public class Product : ICloneable
    {
        public int  m_ID;
        public string  m_Name;
        public ...;
     
        public Product(){}
        public Product( Product copy)
        {
             m_ID = copy.m_ID;
             if (copy.m_Name != null) m_Name = string.Copy( copy.m_Name );
        }
     
        public object Clone()
        {
            return new Product(this);
        }
    }
    Alors pour répondre à ta question, m_ID n'est pas une propriété mais un membre publique, mise à part qu'il pourrait être privé et je pourrais en faire une propriété comme t-elle est la convention sous C#...

    Citation Envoyé par selfaro
    Si le produit appartient déjà à une collection, alors tu empêches de l'ajouter à une autre (le comportement standant d'un DataRow dans un DataTable).
    Je savais pas pour les DataRow...
    Donc si je comprends bien, je récupèrerais une table dans un dataset à l'aide d'un adapteur SQL : myAdap.Fill( dataset1 ); Et pour ma deuxième table je ferais : myAdap.FillSchema( dataset2, SchemaType.Source );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (int i = 0; i < dataset1.Tables[0].Rows. Count; ++i)
         dataset.Tables[0].Add( dataset2.Tables[0].Rows[i] );
    Cela ne fonctionnerait pas parce qu'un DataRow ne peut figurer que dans une collection, ce qui revient à dire une seul DataTable ?

    Donc pour mon problème, tu me dis que si ma référence vers la collection n'est pas NULL alors je génère un exception disant que le produit ne peut être utilisé dans deux collections.

    Mais que fait-on avec l'autre problème de changement de ID ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IEnumerator IE = pc.GetEnumerator(); 
    while ( IE.MoveNext() ) 
      ((Product)IE.Current).m_ID == 10;
    Je SUPPOSE qu'en déclarant le ID comme étant une PROPRIÉTÉ je pourrais ainsi vérifier si la référence sur la collection n'est pas NULL et si c'est le cas alors valider si il y a DUPLICATA ?

    Merci.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut
    ta dernière phrase semble logique

    je crois que la situation est réglè pour ça? (en référence à ce qu'on s'est dit en personne)

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

Discussions similaires

  1. [XSL][XPATH] recopier les attributs d un élément mais pas le
    Par Triangle dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/08/2005, 16h07
  2. Méthode pour supprimer tous les enfants d'un élément
    Par Pymm dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/05/2005, 12h10
  3. Détecter les états des boutons (enfoncé, relaché)
    Par Tray dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/03/2005, 20h12
  4. coment détecter les positions des cotés d'un rectangle?
    Par einegel dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/01/2005, 10h26
  5. comment détecter les faces d'un mur
    Par einegel dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/01/2005, 23h12

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