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 :

[+winform] flowlayoutpanel bindable


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut [+winform] flowlayoutpanel bindable
    Bonjour,

    Est-il possible de rendre un flowlayoutPanel bindable?

    Je m'explique.

    J'ai un applicatif qui permet d'encoder des commandes pour un bar.

    Tout fonctionne bien. Mais j'ai l'impression que ma façon de travailler pourrait être bien mieux.

    Le programme consiste à récupérer les produits existants dans une DB.
    à partir de ces produits, je crée une List<Produit>.

    à partir de cette liste, je crée 3 listes de boutons, listes faites à partir du type de produit.
    - List<Bouton> boutonsSnack, List<Bouton> boutonsBiere, List<Bouton> boutonsSoft.

    et en fonction du choix de type de produit que l'utilisateur veut afficher, j'ajoute un par un mes boutons dans le flowlayoutPanel.

    chaque bouton a comme "fond" l'image du produit, et la propriété Tag du bouton reçoit l'objet Produit.

    Dejà là, n'y a t'il pas moyen de faire plus propre?

    Par là je veux dire que quand je clique sur le bouton correspondant à un produit, je récupère le produit stocké dans le Tag du bouton.
    Je teste ensuite si ce produit est encore en stock ( directement sur l'objet ).
    S'il est en stock, il faut réduire le stock, etc...

    J'ai l'impression que c'est un peu brouillon tout celà.

    N'y a t'il pas une manière plus propre de "binder" le flowlayoutpanel à la liste de mes produits, qui seront représentés dans ce flowlayoutpanel par des boutons et que des actions sur ces boutons se répercuteraient directement sur les produits qu'ils représentent?


    Toute idée est la bienvenue

    Merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    tu peux faire une classe qui hérite de bouton, et qui a un constructeur qui demande un produit, mis dans une variable (et éventuellement accessible en readonly property)
    définition du texte et de l'image
    surcharge de onclick pour gérer le stock
    ...

    concernant le flowlayoutpanel, tu peux aussi en hériter pour lui rajouter une propriété list<Produit>
    dans le set faire la boucle pour instancier des controles précédemment cités
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Merci.

    Je sens que çà va bien le faire.

    Juste une question. est-il possible de rendre une propriété private dans la classe dérivée alors qu'elle est public dans la classe de base?

    Je m'explique.

    J'ai ma classe BoutonProduit qui hérite de la classe Button.
    J'aimerais que les dimensions de mon BoutonProduit soit fixés dans son constructeur, et qu'elles ne soient plus modifiables.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    ca dépend

    pour les propriétés qu'on peut overrider j'aurais tendance à dire oui, mais en cas de cast les propriétés redeviendront surement accessible, et puis ca n'empeche pas la reflection non plus
    pour les propriétés qu'on ne peut pas overrider ca semble encore plus dur à garantir

    après concernant ton besoin spécifique lié à la taille, ces boutons seront en théorie ajoutées dynamiquement, donc tu peux définir la taille dans le constructeur et je ne vois pas qui pourrait alors la modifier
    sinon il reste les propriétés minimumsize et maximumsize, si elles sont définies à la même valeur, alors la size ne peut différer de cette taille, même en mode design (par contre rien n'interdit de modifier ces propriétés pour débrayer)
    autre possibilité, s'abonner à sizeChanged dans ce controle pour en cas de changement redéfinir la taille, et là personne ne pourra alors modifier la taille


    ton appli est multi client ?
    parce que sinon il y a moyen de peaufiner un peu, genre si un client prend le dernier en stock que ca se répercute sur les autres postes avec peu de code (par exemple, avec un rafraichissement des données et inotifypropertychanged, le control hérité de bouton pourra se mettre visible = false automatiquement si stock = 0)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Non l'application n'est pas multiClient, pas pour le moment en tout cas.

    Il est vrai qu'en y réfléchissant un peu, il n'est pas utile de la rendre private.

    j'ai maintenant implementé mes deux classes.

    la classe BoutonProduit

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
     
    namespace GestionBar
    {
        class BoutonProduit : Button
        {
            private Produit produitBouton = new Produit();
     
            public BoutonProduit(Produit ProduitBouton)
                : base()
            {
                this.produitBouton = ProduitBouton;
     
                this.Height = 120;
                this.Width = 120;
                this.Margin = new Padding(0);
                this.BackgroundImage = Image.FromFile(this.produitBouton.Image);
                this.Font = new Font(this.Font, FontStyle.Bold);
                this.TextAlign = ContentAlignment.MiddleCenter;
     
                if (this.produitBouton.Stock == 0)
                {
                    this.Text = "Plus en stock";
                }
            }
     
            public Produit ProduitBouton
            {
                get{ return produitBouton; }
            }
     
            protected override void OnClick(EventArgs e)
            {
                base.OnClick(e);
                this.produitBouton.Stock--;
                if(this.produitBouton.Stock==0)
                {
                    this.Text = "Plus en stock";
                }
            }
        }
    }
    et ma classe ProduitPanel
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace GestionBar
    {
        class ProduitPanel : FlowLayoutPanel
        {
            private List<Produit> listeProduits = new List<Produit>();
     
            public ProduitPanel(List<Produit> ListeProduits)
            {
                listeProduits = ListeProduits;
     
                foreach (Produit produit in listeProduits)
                {
                    this.Controls.Add(new BoutonProduit(produit));
                }
            }
     
            public void AfficherType(TypeBoisson TypeBoisson)
            {
                foreach (BoutonProduit boutonProduit in this.Controls)
                {
                    if (boutonProduit.ProduitBouton.Type == TypeBoisson)
                    {
                        boutonProduit.Visible = true;
                    }
                    else
                    {
                        boutonProduit.Visible = false;
                    }
                }
            }
        }
    }
    l'interactivité sur les boutons fonctionne très bien.
    Le stock sur les "boutons" se mettent bien à jour.

    Maintenant sur l'ancienne version, quand la touche CTRL était enfoncée et que je cliquais sur le bouton, le stock augmentait au lieu de le diminuer.
    Comment puis-je passer l'information "CTRL enfoncé" à mes boutons?

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    sur onclick, tu peux tester control.modifierkeys ou un truc dans le genre, si c'est = à ctrl tu fais un traitement différent (++)

    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private Produit produitBouton = new Produit();
     
            public BoutonProduit(Produit ProduitBouton)
                : base()
            {
                this.produitBouton = ProduitBouton;
    = new Produit(); est inutile ici
    tu vas remplir cette variable dans tous les cas par celle passée au constructeur
    private Produit produitBouton; suffit, à savoir déclarer la variable et son type, en la laissant vide
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    C'était bien celà. super.

    J'ai par contre de nouveau un problème.

    J'utilise un objet Commande (une de mes classes), qui était défini au niveau de ma form.
    Je dois maintenant rendre mon objet accessibles à mes classes que je viens de définir pour intéragir sur la commande.

    Je dois avouer que j'ai appris le C# à l'école et que depuis, de temps en temps je fais un projet perso, mais sans plus.
    Depuis ma sortie d'école c'est PL/1, DB2 et CICS et depuis beaucoup de concepts ont quitté ma mémoire.

    J'avais pensé à créer une instance static d'un objet commande dans une classe à part, mais il me sort des erreurs.

    Est ce qu'une instance static de l'objet te paraît bien?

    Si oui j'ai créé la classe Global qui contient mon objet en static

    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace GestionBar
    {
        public class Global
        {
            private static Commande consommations;
     
            public static Commande Consommations
            {
                get { return consommations; }
                set { consommations = value; }
            }
        }
    }
    j'ai l'erreur suivante à la déclaration des accesseurs : Error 1 Inconsistent accessibility: property type 'GestionBar.Commande' is less accessible than property 'GestionBar.Global.Consommations'

    voici ma classe commande:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    using System.ComponentModel;
     
    namespace GestionBar
    {
        class Commande : INotifyPropertyChanged
        {
            private BindingList<Consommation> listeConsommations;
            private Consommation consommation;
            private decimal montantTotal;
     
            public Commande()
            {
                listeConsommations = new BindingList<Consommation>();
                montantTotal = 0;
            }
     
            public BindingList<Consommation> ListeConsommations
            {
                get { return listeConsommations; }
            }
     
            public decimal MontantTotal
            {
                get { return montantTotal; }
                set { montantTotal = value; }                 
            }
     
            private int IndexOf(Produit Produit)
            {
                int index = -1;
                for (int i = 0; i < listeConsommations.Count; i++)
                {
                    if (listeConsommations[i].ProduitCommande == Produit)
                    {
                        index = i;
                        break;
                    }
                }
                return index;
            }
     
            private void TrierListe()
            {
                for (int i = 0; i < listeConsommations.Count; i++)
                {
                    for (int j = 0; j < listeConsommations.Count; j++)
                    {
                        if (i != j)
                        {
                            if ((listeConsommations[i].ProduitCommande.Nom.CompareTo(listeConsommations[j].ProduitCommande.Nom)) < 0)
                            {
                                consommation = listeConsommations[i];
                                listeConsommations[i] = listeConsommations[j];
                                listeConsommations[j] = consommation;
                            }
                        }
                    }
                }
            }
     
            public void Add(Produit Produit)
            {
                int index = this.IndexOf(Produit);
     
                if (index == -1)
                {
                    consommation = new Consommation(Produit, 1);
                    this.ListeConsommations.Add(consommation);
                    TrierListe();
                }
                else
                {
                    this.ListeConsommations[index].Quantite++;
                }
                this.OnPropertyChanged("ListeConsommations");
                this.MontantTotal += Produit.Prix;
            }
     
            public bool Remove(Produit produit)
            {
                int index = this.IndexOf(produit);
     
                if (index != -1)
                {
                    if (this.listeConsommations[index].Quantite == 1)
                    {
                        this.listeConsommations.Remove(this.listeConsommations[index]);
                    }
                    else
                    {
                        this.listeConsommations[index].Quantite--;
                    }
                    this.OnPropertyChanged("ListeConsommations");
                    this.MontantTotal -= produit.Prix;
     
                    return true;
                }
                else return false;
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            public void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    }
    as-tu une idée du problème?

    Merci

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    normalement ce message d'erreur c'est quand on a une propriété public de type A et que la définition de la classe n'a pas autant de portée
    on ne peut exposer un truc non exposable

    j'imagine que c'est par là "class Commande"
    peut etre public devant

    lire du c# me donne des boutons parfois, avoir une variable privée avec le même nom qu'une propriété à une casse près je trouve ça illisible ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Oui il est vrai que des confusions sont vites faites, et pourtant on nous l'apprend comme celà à l'école.

    J'ai testé de déclarer ma classe en public mais il me demande alors de déclarer toutes les classes utilisées en public.
    Ce qui m'a fait penser à l'accessibilité de ma classe Global et effectivement je l'avais mise en public.
    Je l'air remise en privatte et plus de message d'erreur.

    Si c'est pas indiscret, comment fais-tu la distinction entre tes propriétés et tes accesseurs?

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    Citation Envoyé par djmic Voir le message
    Si c'est pas indiscret, comment fais-tu la distinction entre tes propriétés et tes accesseurs?
    ? accesseurs c'est get et set
    si tu veux parler de propriété et variable, je ne pense pas que c'est très intime comme question ^^

    moi je fais du vb.net, et vb.net est insensible à la casse donc on ne peut pas faire ca
    nous on a une norme au boulot c'est variable privée commence par _
    et ca me plait bien
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    J'ai encore un gros dernier soucis de conception.

    Lors de l'appuie sur les boutons, j'ai des consommations qui sont créées ( classe Consommation ) et ces consommations sont ajoutées une BindingList ( classe Commande );

    Voici ma classe Consommation :

    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
    53
    54
    55
    56
    57
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
    using System.Windows.Forms;
     
    namespace GestionBar
    {
        class Consommation:INotifyPropertyChanged
        {
            private string nomProduit;
            private int quantite;
            private Produit produitCommande;
     
            public string NomProduit
            {
                get { return nomProduit; }
            }
     
            public int Quantite
            {
                get { return quantite; }
                set { 
                        quantite = value;
                        OnPropertyChanged("Quantite");  
                    }
            }
     
            public Produit ProduitCommande
            {
                get{ return produitCommande; }
                set{     
                        produitCommande = value;
                        OnPropertyChanged("ProduitCommande");  
                   }
            }
     
            public Consommation(Produit ProduitCommande, int Quantite)
            {
                produitCommande = ProduitCommande;
                quantite = Quantite;
                nomProduit = ProduitCommande.Nom;
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            public void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    }
    et ma classe commande
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    using System.ComponentModel;
     
    namespace GestionBar
    {
        class Commande : INotifyPropertyChanged
        {
            private BindingList<Consommation> listeConsommations;
            private Consommation consommation;
            private decimal montantTotal;
     
            public Commande()
            {
                listeConsommations = new BindingList<Consommation>();
                montantTotal = 0;
            }
     
            public BindingList<Consommation> ListeConsommations
            {
                get { return listeConsommations; }
            }
     
            public decimal MontantTotal
            {
                get { return montantTotal; }
                set { montantTotal = value; }                 
            }
     
            private int IndexOf(Produit Produit)
            {
                int index = -1;
                for (int i = 0; i < listeConsommations.Count; i++)
                {
                    if (listeConsommations[i].ProduitCommande == Produit)
                    {
                        index = i;
                        break;
                    }
                }
                return index;
            }
     
            private void TrierListe()
            {
                for (int i = 0; i < listeConsommations.Count; i++)
                {
                    for (int j = 0; j < listeConsommations.Count; j++)
                    {
                        if (i != j)
                        {
                            if ((listeConsommations[i].ProduitCommande.Nom.CompareTo(listeConsommations[j].ProduitCommande.Nom)) < 0)
                            {
                                consommation = listeConsommations[i];
                                listeConsommations[i] = listeConsommations[j];
                                listeConsommations[j] = consommation;
                            }
                        }
                    }
                }
            }
     
            public void Add(Produit Produit)
            {
                int index = this.IndexOf(Produit);
     
                if (index == -1)
                {
                    consommation = new Consommation(Produit, 1);
                    this.ListeConsommations.Add(consommation);
                    TrierListe();
                    //ListeConsommations = ListeConsommations.OrderBy(x => x.nomProduit).ToList()
                    //List<Consommation> ListeTriee = ListeConsommations.OrderBy(x => x.nomProduit).ToList();
                    //this.ListeConsommations = new BindingList<Consommation>(ListeTriee);
                }
                else
                {
                    this.ListeConsommations[index].Quantite++;
                }
                this.OnPropertyChanged("ListeConsommations");
                this.MontantTotal += Produit.Prix;
            }
     
            public bool Remove(Produit produit)
            {
                int index = this.IndexOf(produit);
     
                if (index != -1)
                {
                    if (this.listeConsommations[index].Quantite == 1)
                    {
                        this.listeConsommations.Remove(this.listeConsommations[index]);
                    }
                    else
                    {
                        this.listeConsommations[index].Quantite--;
                    }
                    this.OnPropertyChanged("ListeConsommations");
                    this.MontantTotal -= produit.Prix;
     
                    return true;
                }
                else return false;
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            public void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    }
    La première chose est que ce sont deux classes distinctes, mais la classe consommation n'est utilisée que par la classe Commande.

    Deuxième chose, j'ai dû utiliser une bindingList car le binding à un datagridview ne fonctionnait pas avec une List<>. Mais la bindingList ne supporte pas le tri. donc j'ai du crée ma méthode moi-même.

    En rassemblant ces problèmes, n'y a t'il pas moyen de créer une classe qui hériterait de List<> qui serait bindable, et donc chaque élément serait constitué d'un Produit et d'une quantité?

    Merci

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    je ne pourrais pas trop t'aider, je n'utilise pas les binding de windows forms, donc je ne sais pas trop comment ca marche sur un dgv
    mais tu peux hériter de binding list


    après si ton binding list ne supporte pas le tri, tu dois pouvoir faire une propriété readonly qui en retourne un nouveau avec du linq to object qui tri
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Est-ce que tu as connaissance de List avec plusieurs dimensions afin de ne plus avoir recours à ma classe consommation ?

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    pas compris pourquoi tu avais une classe consommation et une classe commande

    pour moi une commande contient des produits
    donc soit plusieurs instances du même produit, soit un dictionary<produit,int32> (pour la quantité)

    (...)

    ah si je vois finalement car j'allais aussi te proposer une classe qui contient le produit et la quantité, mais c'est ce que tu as en fait

    et ca te pose problème à quel niveau ?
    tu peux aussi remplir ton dgv à la main
    ou s'il y a moins de 3 colonnes t'en passer (genre flowlayoutpanel autoscroll avec un usercontrol pour l'affichage produit/qté/autre)
    ce qui permet au passage de faire des catégories collapsables (enfin c'est une idée c'est peut etre inutile)
    parce qu'en fait en windows forms on peut faire des treeview complexes avec un rendu qui n'a pas à rougir face à wpf (enfin moins que le treeview de winform ^^) avec des flowlayoutpanels imbriqués (au sein d'un usercontrol)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Le Dictionnary m'a l'air pas mal.

    Je vais jeter un coup d'oeil de ce côté là.

    Je trouvais que créer une classe consommation juste pour l'utiliser dans la commande était un peu lourd.

    Je vais aussi me pencher un flowlayoutpanel pour afficher ma commande.ça m'a l'air pas mal.

    Je me pencherais sur ces deux concepts dès demain.

    Un grand merci.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Hello,

    je viens seulement de prendre le temps de continuer sur mon projet.

    Je veux transformer ma classe commande et travailler sur un Dictionary.

    Donc mon idée était de baser ma classe sur l'interface IDictionnary, mais je ne sais pas comment m'y prendre.

    Pour l'instant j'ai fait l'implémentation de l'interface mais je ne sais pas par où commencer.

    Sur quel type d'objet, qui va représenter mon produit + ma quantité, je dois travailler?

    Je ne trouve pas d'exemple similaire à ce que je veux faire.

    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
     
        class Commande : IDictionary<Produit, Int32>, INotifyPropertyChanged
        {
            #region IDictionary<Produit,int> Members
     
            public void Add(Produit key, int value)
            {
                throw new NotImplementedException();
            }
     
            public bool ContainsKey(Produit key)
            {
                throw new NotImplementedException();
            }
     
            public ICollection<Produit> Keys
            {
                get { throw new NotImplementedException(); }
            }
     
            public bool Remove(Produit key)
            {
                throw new NotImplementedException();
            }
            ...
    Merci

  17. #17
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    quand on a besoin d'un dictionary, on n'est pas forcément obligé d'implémenter IDictionary
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    je voulais pouvoir ajouter des propriété à ma classe commande.

    J'ai vraiment du mal à me lancer. Si tes précieux conseils sont à ma disposition je suis partant

    J'aimerai bien partir sur le principe précédent.

    C'est à dire créer une classe basée sur le flowlayoutPanel mais le rendre cette fois-ci bindable.
    Il serait bindée sur ma commande donc la portée est globale à ma solution. ma commande serait constitué d'un dictionary comme tu me l'a conseillé ( Dictionary<Produit,Int32> )
    Cette classe créerait des usercontrol, user controle comprenant deux libellés ( un avec le nom du Produit, un avec la quantité ).

    Penses-tu que c'est faisable?

    Merci beaucoup.

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    c'est à dire que je ne vois pas trop où tu bloques
    tu as déjà fait un flp hérité qui pose des boutons, c'est pareil pour poser des uc (uc qui demande produit et qté)
    et pour le dictionary c'est un for each produit in dico.keys et la quantité est dans dico(produit)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 78
    Points
    78
    Par défaut
    Hello,

    Je voulais en fait, ne pas devoir mettre à jour moi même ma liste d'items de mon FLP pour que ça reste fluide.
    je vais essayer d'essayer de procéder de la même manière que précédemment et je verrai si ça me convient

Discussions similaires

  1. [VS.NET] [WinForms] [VB.NET] Créer un installeur
    Par Fruity dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/05/2008, 16h50
  2. [C#] [WinForms] Ascenceur du DataGrid !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 9
    Dernier message: 21/09/2004, 17h15
  3. [C#] [WinForms] Passage de fenetres...
    Par lololefada dans le forum Windows Forms
    Réponses: 29
    Dernier message: 19/07/2004, 16h15
  4. [VB.NET] [WinForms] Emdebed Ressource !
    Par maitrebn dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/07/2004, 12h46
  5. [VB.NET] [Winform] DataGrid Excel et CheckBox
    Par mic56 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/06/2004, 16h10

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