Chargement combo

Signaler
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008
-
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008
-
Bonjour à tous,

J'ai un soucis avec le chargement d'une combo, je vous explique :

J'ai une classe ArticleEntity composé des attributs Code, Nom et Famille,.... 
J'ai un formulaire pour modifié un article avec :
Un BindingSource nommé articleEntityBindingSource  pour mon article avec la propriétés suivante :
    DataSource : ArticleEntity

un textbox Code, un autre pour le Nom et une ComboBox pour la liste des familles.

J'ai placé un autre bindingsource nommé familleBindingSource sur mon formulaire avec comme propriété :
       DataSource : FamilleEntity  (Nom de la classe des familles)

Ma Combo à les propriétés suivantes :
       DataSource : familleBindingSource
       DisplayMember : FamilleProduitNom       (Attribut Nom de la classe FamilleEntity)
       ValueMember   : CodeFamille                  (Attribut Code de la classe FamilleEntity)
       DataBindings.SelectedValue : articleEntityBindingSource - CodeFamilleProduit        
       DataBindings.Text : familleProduitEntityBindingSource - FamilleProduitNom

Dans l'événement Load de ma form, voilà le code que j'ai écrit :
                FamilleproduitDAO daoFamille = new FamilleproduitDAO();
                FamilleproduitEntityCollection collectionFamille = new FamilleproduitEntityCollection(daoFamille.SelectFamilles());
                familleProduitEntityBindingSource.DataSource = collectionFamille;

Ma combo se charge bien avec toutes le familles possibles mais se positionne sur le premier élément de ma liste et non pas sur la valeur réel de mon article.

En espérant avoir été assez clair.
J'ai vraiment besoin de votre car je ne sais plus quoi faire.

Merci d'avance

      

9 réponses

Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Je comprends pas trop ces 2 lignes :

       DataBindings.SelectedValue : articleEntityBindingSource - CodeFamilleProduit        
       DataBindings.Text : familleProduitEntityBindingSource - FamilleProduitNom

pourrais-tu les expliquer ?

Mathmax
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Il s'agit des propriétés DataBindings.SelectedValue et Text de ma combo.
Ces deux lignes ne sont pas du code, elles représentent ce que j'ai mis dans les propriétés avec le designer :
Dans la propriété DataBindings.SelectedValue, j'ai mis l'attribut CodeFamilleProduit de ma source de donnée articleEntityBindingSource pour justement afficher la valeur de la zone famille de mon article.
Dans la propriété DataBindings.Text, j'ai mis l'attribut FamilleProduitNom de ma source de données familleProduitEntityBindingSource mais j'étais pas très sûr de moi.
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Je ne vois pas de propriété DataBindings.SelectedValue et DataBindings.Text pour une combebox.Seulement des propriétés SelectedValue et Text. Si tu utilise SelectedValue directement, ça ne marche pas ?

Sinon, un autre truc que je comprends pas trop : familleProduitEntityBindingSource et familleBindingSource , c'est la même chose ?

Mathmax
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Sur le designer, tu te positionnes sur ta combo tu as une propriété Databindings, tu cliques sur le + pour déployer de nouvlles propriétés dont SelectedValue et Text.

Tu as raison, je me suis mélangé les pinceaux mais familleProduitEntityBindingSource et familleBindingSource sont un seul et même objet.

Je suis passer par le designer pour placer mes bindingsource sur ma form et les propriétés de ma combo. Je veux bien essayer de tout faire par code mais je ne sais pas comment...
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Le problème c'est que je ne vois pas trop à quoi est relié articleEntityBindingSource. Mais tu dois avoir un article "courant". Appelons-le "MonArticle".

Purquoi n'écris-tu pas celà ?

MaCombo.SelectedValue = MonArticle.CodeFamilleProduit;

En supposant que la classe ArticleEntity  possède une propriété CodeFamilleProduit de type string.

Mathmax
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

Par contre ce que je ne sais pas faire et que j'aimerais bien savoir faire est créer une relation entre 2 listes d'objets :
En reprenant ton exemple, on aurait 2 combobox dans notre forme. La première afficherait la liste des familles de produit, la deuxième afficherait la liste des articles qui font partie de la famille sélectionnée dans le combobox 1.
Ca ce fait facilement avec des tables d'un dataset, mais je me demande si ça se fait avec des listes d'objets. Si quelqu'un sait ça, ça m'intéresse beaucoup.
Mathmax
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Ca ne marche pas MaCombo.SelectedValue = MonArticle.CodeFamilleProduit, en fait ça équivaut à ce que j'ai fait en mettant dans la propriété SelectedValue de ma combo : articleEntityBindingSource - CodeFamilleProduit

Pour la relation, j'ai bien sur créer une relation dans mon SGBD et pour mes classes, voilà ce que j'ai fait
public class ArticleEntity : ProduitEntity
    {
...
              private FamilleproduitEntity _CodeSousFamilleProduit = null;
...
}
De plus, j'ai une couche d'accès aux données avec Nhibernate, j'ai donc également créé ma relation dans mon fichier de configuration
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

en fait ça équivaut à ce que j'ai fait en mettant dans la propriété
SelectedValue de ma combo : articleEntityBindingSource -
CodeFamilleProduit



Non, tu le mettais dans SelectedValue du BindingSource du Combo et non dans le SelectedValue du combo.

Pour la relation, j'ai bien sur créer une relation dans mon SGBD

Je parlais d'une relation entre les table d'un dataset. Mais visiblement tu n'en utulise pas, tu charge directement tes données dans des listes de classes. Si tu charge tes données dans des DataTable, tu n'aura pas de problème pour les mettre en relation. Par contre avec des listes d'objets, je me demande si il est possible de le mettre en relation...

Sinon je ne suis pas sûr d'avoir parfaitement saisi ton problème. Voici le code que je te propose. 2 combobox dans une form (cmbFamilles et cmbProduits). Quand tu séléctionne une famille de produits, tu séléctionne le premier élément de cmbProduits dont la famille de produit a cette valeur.

        private List<FamilleDeProduit> famillesDeProduit;
        private List Produits;

        private void Form1_Load(object sender, EventArgs e)
        {
            famillesDeProduit = new List<FamilleDeProduit>();
            famillesDeProduit.Add(new FamilleDeProduit("famille 1", 1));
            famillesDeProduit.Add(new FamilleDeProduit("famille 2", 2));

            Produits = new List();
            Produits.Add(new Produit("produit 1", 1, 1));
            Produits.Add(new Produit("produit 2", 2, 2));
            Produits.Add(new Produit("produit 3", 3, 2));

            BindingSource bsFamilles = new BindingSource();
            bsFamilles.DataSource = famillesDeProduit;
            cmbFamilles.DataSource = bsFamilles;
            cmbFamilles.DisplayMember = "Name";

            BindingSource bsProduits = new BindingSource();
            bsProduits.DataSource = Produits;
            cmbProduits.DataSource = bsProduits;
            cmbProduits.DisplayMember = "Name";
            cmbProduits.ValueMember = "FamilleId";
        }

        private void cmbFamilles_SelectedIndexChanged(object sender, EventArgs e)
        {
            cmbProduits.SelectedValue = ((FamilleDeProduit)cmbFamilles.SelectedValue).Id;
        }
    }

    public class Produit
    {
        private string _Name;
        private int _Id;
        private int _FamilleId;

        public Produit(string name, int id, int familleId)
        {
            _Name = name;
            _Id = id;
            _FamilleId = familleId;
        }

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        public int FamilleId
        {
            get { return _FamilleId; }
            set { _FamilleId = value; }
        }

        public int Id
        {
            get { return _Id; }
            set { _Id = value; }
        }
    }

    public class FamilleDeProduit
    {
        private int _Id;
        private string _Name;

        public FamilleDeProduit(string name, int id)
        {
            _Id = id;
            _Name = name;
        }

        public int Id
        {
            get { return _Id; }
            set { _Id = value; }
        }

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    }

Mais cette solution n'est pas très satisfaisante. Elle se base sur un événement et non sur une relation entre les 2 listes.
Mathmax
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Merci pour toutes réponses.

Je vais essayer ce soir mais comme tu l'as dis, je pense que cette solution n'est pas satisfaisante.


Je ne parle pas de DataSet, quand j'ai dit "Pour la relation, j'ai bien sur créer une relation dans mon SGBD", je parlait de réellement d'une relation (clé étrangère) dans ma base de données MySql

Je ne voulais pas passer par les DataSet car je ne sais pas trop m'en servir. J'ai essayé mais le DataSet que j'ai créé (par l'assistant) est l'image de la base de données avec des DataTable, DataRow. On perd donc la notion d'objet métier (ceux que j'ai appelé Article, FamilleArticle).

Peux créer un DataSet à partir de classes ?