Compter les element dans une listbox

riabi - 25 janv. 2017 à 17:48 - Dernière réponse : Whismeril 10515 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention
- 26 janv. 2017 à 16:58
Bonjour,
salut ,je travaille sur visual basic j'arrive pas a afficher la somme des element de ma liste box
merci c vraiment urgent
Afficher la suite 

12 réponses

Répondre au sujet
Whismeril 10515 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 25 janv. 2017 à 18:40
0
Utile
Bonjour

Compter les element dans une listbox
ceci veut à priori dire savoir combien il y a d'éléments dans ma listbox, et
la somme des element de ma liste box
ceci fait plutôt penser à une colonne de nombres à faire la somme.....

Donc peux tu clarifier ton besoin?
Dans le second cas, ta listbox est elle bindée, si oui comment?

PS, nous sommes tous bénévoles, et il n'y a rien d'urgent pour nous à répondre à une question. Le fait de l'écrire aurait plutôt tendance à faire passer son chemin à beaucoup de forumeurs.
Commenter la réponse de Whismeril
0
Utile
Merci whismeril
Je voulais exécuter un programme comme une caisse(restaurant)
Mon projet contient 5 forms
Form1 contient 4 boutons principal(btnplat btnsandwich btnbreuvage btnsalade)
Une liste box

Form2 contient des bouton(assiette1,assiette2..)
Quand je click aur btnaasiette1 il affiche dans la listbox: assiette1 12$)
Btnassiette2 affiche assiette 2 16$

Je veux que btnsomme affiche la somme des prix dans lq liste box
Merci
Commenter la réponse de Riabi
Whismeril 10515 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 25 janv. 2017 à 19:33
0
Utile
OK, mais comment ton btnaasiette1 fait pour afficher assiette1 12$ dans la listbox?
Commenter la réponse de Whismeril
0
Utile
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnassiettes1.Click
assiettes1 = 10.95
Form1.lstbox1.Items.Add("Assiette $" & SHishT)
Commenter la réponse de riabi
Whismeril 10515 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 25 janv. 2017 à 21:43
0
Utile
7
mouais, c'est ce que je "craignais".

Alors le plus simple (ensuite une fois qu'on a bien compris le truc) à coder est d'utiliser VB.net pour ce qu'il est: un langage objet prévu pour le MVC.

Donc l'idée est de créer une classe, qui a au moins 2 propriétés: le nom du plat et son prix.

De binder une collection de cette classe sur la listbox (pour la partie vue), de faire les calculs sur la collection (pour la partie contrôler) et même avoir une base de données (un fichier texte si tu es sur qu'il n'y aura jamais que 4 plats, suffit amplement) pour la partie modèle.

Pour l'exemple, je prends un fichier csv, c'est éditable avec Excel (le jour ou les prix changent, ça évitera de tout recompiler)
Assiette 1;12
Assiette 2;12,5
Dessert 1;4,75
Dessert 2;5,30
Attention sur mon PC, le symbole décimal, c'est la virgule, si tu utilises le point, il faut modifier le csv (ou gérer dans le code les 2 options, ce que je n'ai pas fait là).

La classe, à noter, j'aime bien qu'une classe sache importer elle-même son contenu, mais ça n'est pas obligé.
Imports System.IO

Class Plat
    Public Property Prix() As Double

    Public Property Nom() As String

    ''' <summary>
    ''' Texte qui sera écrit dans la ListBox
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function ToString() As String
        Return String.Format("{0} : {1:F2}$", Nom, Prix)
    End Function


    ''' <summary>
    ''' Lit et importe le fichier csv
    ''' </summary>
    ''' <param name="Fichier">Chemin du fichier</param>
    ''' <returns>Liste des plats</returns>
    Public Shared Function Deserialize(ByVal Fichier As String) As List(Of Plat)
        Dim lignes() As String = File.ReadAllLines(Fichier) 'lit le fichier et place chaque ligne dans un tableau de string

        Dim lesPlats As New List(Of Plat)()

        For Each l As String In lignes 'lit chauqe ligne
            Dim valeurs() As String = l.Split(";"c) 'découpe la ligne grâce au séparateur ;

            Dim lePlat As Plat = New Plat With {.Nom = valeurs(0), .Prix = Convert.ToDouble(valeurs(1))}

            lesPlats.Add(lePlat) 'ajoute l'instance dans la liste
        Next l

        Return lesPlats 'retourne la liste

        'Pour info, une fois le principe bien acquis, tu pourras essayer de jouer avec Linq, ça tient sur une ligne.
        Return File.ReadAllLines(Fichier).Select(Function(l) l.Split(";"c)).Select(Function(x) New Plat With {.Nom = x(0), .Prix = Convert.ToDouble(x(1))}).ToList()
    End Function
End Class


Et dans ton form (ici Form1)
   Private Sub monBouton_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim monBouton As Button = CType(sender, Button)
        Dim indexPlat As Integer = CInt(monBouton.Tag)

        laCommande.Add(lesPlats(indexPlat)) 'on ajoute un plat
        listBox1.DataSource = Nothing
        listBox1.DataSource = laCommande 'on binde la collection sur la listbox

        textBoxTotal.Text = laCommande.Sum(Function(c) c.Prix).ToString("F2")
    End Sub

    Private lesPlats As List(Of Plat) 'déclaration de la liste dont la portée englobe la form entière.
    Private laCommande As New List(Of Plat)()


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        lesPlats = Plat.Deserialize("C:\Temp\LesPlats.csv") 'import des données.

        'création des boutons
        For i As Integer = 0 To lesPlats.Count - 1
            Dim monBouton As New Button()

            monBouton.Location = New System.Drawing.Point(50, 35 * i + 50)
            monBouton.Size = New System.Drawing.Size(120, 30)
            monBouton.Text = lesPlats(i).Nom
            monBouton.Tag = i 'de façon à savoir à quel plat correspond le bouton
            AddHandler monBouton.Click, AddressOf monBouton_Click
            Me.Controls.Add(monBouton)
        Next i


Il faut juste une ListBox (listbox1) et un TextBox (textBoxTotal).

Si tu veux faire une nouvelle commande, tu ajoutes un bouton qui vide la liste et la rebinde.
Si tu veux enlever un plat de la commande, tu ajoutes un bouton qui supprime l'item au même index que celui sélectionné sur la Listbox et tu rebindes.


Whismeril 10515 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 26 janv. 2017 à 06:19
As tu essayé mon code, dans un projet neuf, comme je te l'ai suggéré?
L'as tu exécuté pas à pas (un point d'arrêt au début puis F10 pour avancer ligne par ligne ou F11 pour entrer dans un méthode appelée) et regarder (en survolant les variable avec ta souris ou en utilisant des espions) comment évoluent les données?

J'avais bien compris que tu débutes, c'est pour ça que j'ai détaillé le code.

Mais au final, c'est à ça que devrait ressembler, un code vb.net bien structuré.

Alors certes, ça oblige à écrire des classes, avec à minima les 2 propriétés Nom et Prix et la surcharge de ToString (lire le fichier on pourrait le faire dans Form1), mais avec ce bout de code, tu peux changer les prix, changer les noms des plats, ajouter des plats (pas 50 sinon Form1 se trop petit) sans avoir à recompiler, il suffit d'éditer le csv.
Et la somme se fait sur une ligne, au fur et à mesure que tu ajoutes un plat.

Alors qu'avec la méthode de saisie que tu appliques, il faut décomposer le texte écrit dans la listbox pour en extraire le prix. Ou encore, en même temps que tu ajoutes des plats, tu ajoutes les prix dans une collections dédiée et c'est elle que tu sommes (mais quand tu supprimes, ou quand il y a une nouvelle commande, tu dois gérer la listbox et la collection)

Tout ça se fait, mais j'ai préféré te montrer "les bonnes pratiques", travailler sur une seule collection, juste mettre à jour l'affichage, quand il y en a besoin, et faire des calculs avec des nombres et pas à partir d'un texte.

Le code n'est pas le plus optimisé possible, pour ne pas t'en mettre trop d'un coup.
Mais on peut, quand on a un peu plus d'expérience, réduire par ci par là, et surtout faire en sorte que la liste soit mise quasi automatiquement à jour au moindre changement. Par exemple avec cette méthode.

Actuellement, si tu cliques 2 fois sur le même bouton, ça ajoute deux lignes, on peut aussi faire en sorte que ça mettent sur une seule ligne le plat la quantité, le prix unitaire et le prix total, sans trop se casser la tête (contrairement à ta méthode ou il faudrait analyser tout les textes dans la liste pour savoir si un correspond décomposer, recomposer....)

Je peux te poster des exemples, y a pas de problèmes, répondre à tes questions.
Je te demande juste d'essayer de comprendre comment ça marche, si tu n'y arrives pas on fera à ta sauce.
Un grand merci whismeril
Je vais essayer ton code
cs_Le Pivert 4759 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 26 janv. 2017 à 10:05
Bonjour,

Whismeril

Petite erreur dans l’événement du button:

AddHandler monBouton.Click, AddressOf Button_DoubleClick 
 Private Sub Button_DoubleClick(sender As System.Object, e As System.EventArgs)
        ' On récupère le contrôle cliqué ...
        Dim textTmp As Button = DirectCast(sender, Button)
        MsgBox("Index " & textTmp.TabIndex)
        MsgBox("Bouton cliqué " & textTmp.Text)
    End Sub
Whismeril 10515 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention > cs_Le Pivert 4759 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 26 janv. 2017 à 15:45
Ha tiens, j'en l'ai testé pourtant.
Je regarde ça ce soir. Merci
Whismeril 10515 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 26 janv. 2017 à 16:58
Qu'est ce qui te pose soucis?
  • le CType à la place du DirectCast? pour le sender l'un ou l'autre ne font pas de différence, mais pour récupérer le Tag en Integer, il faut faire Cint, parce que Tag est un Object et qu'Intègre n'en dérive pas directement.
  • le AddHandler, qui est dans la boucle plutôt que juste avant la méthode? Je l'ai mis dans la boucle pour que chaque click de chaque bouton y soit associé. Comme je génère les bouton dynamiquement, c'est le plus simple.


Tel que je l'ai posté, ça fonctionne.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.