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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    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 confirmé
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    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 confirmé
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    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

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, 15h50
  2. [C#] [WinForms] Ascenceur du DataGrid !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 9
    Dernier message: 21/09/2004, 16h15
  3. [C#] [WinForms] Passage de fenetres...
    Par lololefada dans le forum Windows Forms
    Réponses: 29
    Dernier message: 19/07/2004, 15h15
  4. [VB.NET] [WinForms] Emdebed Ressource !
    Par maitrebn dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/07/2004, 11h46
  5. [VB.NET] [Winform] DataGrid Excel et CheckBox
    Par mic56 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/06/2004, 15h10

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