Compter les element dans une listbox

riabi - 25 janv. 2017 à 17:48
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 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

5 réponses

Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
25 janv. 2017 à 18:40
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.
0
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
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
25 janv. 2017 à 19:33
OK, mais comment ton btnaasiette1 fait pour afficher assiette1 12$ dans la listbox?
0
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
25 janv. 2017 à 21:43
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.


0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
25 janv. 2017 à 22:01
PS, teste ça dans un projet tout neuf, avec juste le textbox et la listbox posés sur la form en mode design.
0
Whismeril, thnks bro
Je suis debutant en vb
Je suis vraiment perdu
Tu parle d'un niveau tres avancé pour moi
Veux tu que je met mon code ici
Comme ca tu peux le voir au complet
Merci
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
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.
0
Un grand merci whismeril
Je vais essayer ton code
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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
0
Rejoignez-nous