Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > VB.NET
VB.NET Forum d'entraide sur la programmation Visual Basic .NET. Avant de poster -> FAQ VB.NET, Articles VB.NET, Sources VB.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/12/2012, 22h28   #1
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Par défaut Erreur pour somme de colonne datagridview dans label

Bonsoir amis développeur,

Pour ma DataGridView je souhaiterai avoir la somme de ma colonne "Quantité" dans un label placé sous la dernière ligne du DGV.

Voici ce que j'ai trouvé pour le moment :

Code :
1
2
3
4
5
6
7
8
9
Dim TotalQTE As Double
        Try
        For Each row As DataGridViewRow In DataGridView1.Rows
            TotalQTE = TotalQTE + row.Cells("QuantitéDataGridViewTextBoxColumn").Value
        Next
        Label1.Text = TotalQTE
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

Le calcul marche bien mais à chaque saisie j'ai le message d'erreur suivant :
-> La conversion de la chaîne"" en type 'Double' n'est pas valide


Comment obtenir la bonne chose ??

Merci pour vos précieuse aide

Cordialement,
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 23h22   #2
Mario Rousson
Membre habitué
 
Inscription : février 2006
Messages : 361
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : février 2006
Messages : 361
Points : 136
Points : 136
Salut,

à première vue j'essayerais quelque chose comme ça

Code :
TotalQTE = TotalQTE + Cdbl(row.Cells("QuantitéDataGridViewTextBoxColumn").Value)

je crois
Mario
Mario Rousson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 23h25   #3
mdevaux62
Membre actif
 
Michel Devaux
Inscription : janvier 2010
Messages : 102
Détails du profil
Informations personnelles :
Nom : Michel Devaux

Informations forums :
Inscription : janvier 2010
Messages : 102
Points : 181
Points : 181
A tester (c'est en décimal... mais ça devrait marcher en double) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
    Private Function CalculSomme(nomColonne As String) As Decimal
        'En entrée le Nom (propriété Name) de la colonne
        Dim Total As Decimal = 0
        'Evaluer toutes les rangées du tableau dans la colonne en cours
        For Each row As DataGridViewRow In DataGridView1.Rows
            'Récupération de la cellule
            Dim cellule As DataGridViewCell = DataGridView1.Item(nomColonne, row.Index)
            Try
                'Récupération du contenu avec suppression du symbole €
                Dim contenu As String = cellule.Value.ToString.Replace("€", "")
                'Tentative de conversion en décimal
                Dim valeur As Decimal
                If Decimal.TryParse(contenu, valeur) = True Then
                    'Addition
                    Total += valeur
                End If
            Catch ex As Exception
                '
            End Try
        Next
        'En sortie le total (décimal)
        Return Total
    End Function
mdevaux62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/12/2012, 23h44   #4
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Merci pour ta réponse super rapide mdevaux62, cela me fait super plaisir car tu a l'air de bien maîtriser la chose

Pour ton code Mario cela ne fonctionne pas.

mdevaux62, est-ce que "Total" dans ton exemple correspond au propriété Name de ma colonne ??

Si c'est le cas j'ai donc ceci mais je n'ai aucun résultat dans un label :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Function CalculSomme(ByVal nomColonne As String) As Decimal
        'En entrée le Nom (propriété Name de la colonne) de la colonne
        Dim QuantitéDataGridViewTextBoxColumn As Decimal = 0
        'Evaluer toutes les rangées du tableau dans la colonne en cours
        For Each row As DataGridViewRow In DataGridView1.Rows
            'Récupération de la cellule
            Dim cellule As DataGridViewCell = DataGridView1.Item(nomColonne, row.Index)
            Try
                'Récupération du contenu avec suppression du symbole €
                Dim contenu As String = cellule.Value.ToString.Replace("€", "€")
                'Tentative de conversion en décimal
                Dim valeur As Decimal
                If Decimal.TryParse(contenu, valeur) = True Then
                    'Addition
                    QuantitéDataGridViewTextBoxColumn += valeur
                End If
            Catch ex As Exception
                '
            End Try
        Next
        'En sortie le total (décimal)
        Return QuantitéDataGridViewTextBoxColumn
    End Function
Si j'avais la possibilité de garder le symbole € sa serait le top (je n'y avais même pas penser car trop compliqué pour moi)

Comment obtenir le résultat dans mon label1.text ??

Merci beucoup
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 09h06   #5
mdevaux62
Membre actif
 
Michel Devaux
Inscription : janvier 2010
Messages : 102
Détails du profil
Informations personnelles :
Nom : Michel Devaux

Informations forums :
Inscription : janvier 2010
Messages : 102
Points : 181
Points : 181
Pas compliqué de mettre le résultat dans un label :
Code :
Label1.Text = CalculSomme("ColonneTotal").ToString
Si on veut ce résultat au format monnaie :
Code :
Label1.Text = FormatMonnaie(CalculSomme("ColonneTotal"))
Enfin, en combinant avec les deux autres sujets, ça donne ça :
Un évènement _CellValueChanged qui calcule et affiche en plus dans Label1 la somme d'une colonne du Datagrid.
Ce résultat est affiché au format monnaie.

Code :
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
    Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        If e.ColumnIndex < 0 Or e.RowIndex < 0 Then
            Exit Sub
        End If
        'Obtenir le composant
        Dim grid As DataGridView = DirectCast(sender, DataGridView)
        'Définir le nom des colonnes (à changer en fonction de tes propres paramètres)
        Dim colonneQuantite As String = "ColonneQuantite"
        Dim colonnePrixUnit As String = "ColonnePrixUnit"
        Dim colonneTotal As String = "ColonneTotal"
        'Obtenir la cellule et son contenu
        Dim cellule As DataGridViewCell = grid.Item(e.ColumnIndex, e.RowIndex)
        Dim contenuCellule As String = CStr(cellule.Value)
        'En fonction de la colonne où se trouve la cellule
        Dim nomColonne As String = grid.Columns(e.ColumnIndex).Name
        Select Case nomColonne
            Case colonneQuantite
                Try
                    'Calculer le total
                    Dim celluleMultiplicande As DataGridViewCell = grid.Item(colonnePrixUnit, e.RowIndex)
                    Dim celluleTotal As DataGridViewCell = grid.Item(colonneTotal, e.RowIndex)
                    If celluleMultiplicande.Value.ToString <> "" Then
                        Try
                            Dim multiplicateur As Decimal = CDec(RectifierSeparateur(contenuCellule))
                            Dim multiplicande As Decimal = CDec(RectifierSeparateur(celluleMultiplicande.Value.ToString))
                            celluleTotal.Value = (multiplicande * multiplicateur).tostring
                        Catch ex As Exception
                            MessageBox.Show(ex.Message)
                        End Try
                    End If
                Catch ex As Exception
                    '
                End Try
            Case colonnePrixUnit
                If contenuCellule <> "" Then
                    Try
                        'Appliquer le format
                        Dim mutiplicande As Decimal = CDec(RectifierSeparateur(contenuCellule))
                        cellule.Value = FormatMonnaie(mutiplicande)
                        'Calculer le total
                        Dim celluleMultiplicateur As DataGridViewCell = grid.Item(colonneQuantite, e.RowIndex)
                        Dim celluleTotal As DataGridViewCell = grid.Item(colonneTotal, e.RowIndex)
                        If celluleMultiplicateur.Value.ToString <> "" Then
                            Try
                                Dim multiplicateur As Decimal = CDec(RectifierSeparateur(celluleMultiplicateur.Value.ToString))
                                celluleTotal.Value = (mutiplicande * multiplicateur).ToString
                            Catch ex As Exception
                                MessageBox.Show(ex.Message)
                            End Try
                        End If
                    Catch ex As Exception
                        '
                    End Try
                End If
            Case colonneTotal
                If contenuCellule <> "" Then
                    Try
                        'Appliquer le format
                        Dim total As Decimal = CDec(RectifierSeparateur(contenuCellule))
                        cellule.Value = FormatMonnaie(total)
                        'Calculer la somme de la colonne Total et placer le résultat dans Label1
                        Label1.Text = FormatMonnaie(CalculSomme("ColonneTotal"))
                    Catch ex As Exception
                        '
                    End Try
                End If
        End Select
    End Sub
 
    Private Function RectifierSeparateur(valeur As String) As String
        Dim separateur As String = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
        valeur = valeur.Replace(".", separateur)
        valeur = valeur.Replace(",", separateur)
        Return valeur
    End Function
 
    Private Function FormatMonnaie(valeur As Decimal) As String
        Return String.Format("{0:0.00} €", valeur)
    End Function
 
    Private Function CalculSomme(nomColonne As String) As Decimal
        'En entrée le Nom (propriété Name) de la colonne
        Dim Total As Decimal = 0
        'Evaluer toutes les rangées du tableau dans la colonne en cours
        For Each row As DataGridViewRow In DataGridView1.Rows
            'Récupération de la cellule
            Dim cellule As DataGridViewCell = DataGridView1.Item(nomColonne, row.Index)
            Try
                'Suppression du symbole €
                Dim contenu As String = cellule.Value.ToString.Replace("€", "")
                'Tentative de conversion en décimal
                Dim valeur As Decimal
                If Decimal.TryParse(contenu, valeur) = True Then
                    'Addition
                    Total += valeur
                End If
            Catch ex As Exception
                '
            End Try
        Next
        'En sortie le total (décimal)
        Return Total
    End Function
Sinon, il y avait une erreur dans ton code reporté précédemment.
Ce n'est pas :
Code :
Dim contenu As String = cellule.Value.ToString.Replace("€", "€")
Qui d'ailleurs ne sert à rien (!!!)

Mais :
Code :
Dim contenu As String = cellule.Value.ToString.Replace("€", "")
Cette erreur induisait sans doute l'absence de calcul..
mdevaux62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2012, 09h52   #6
jeremyvb11
Membre à l'essai
 
Homme jeremy
developpeur
Inscription : décembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Nom : Homme jeremy
Localisation : France

Informations professionnelles :
Activité : developpeur
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : décembre 2011
Messages : 102
Points : 21
Points : 21
Encore une fois dans le mille mdevaux62

Grace à toi j'avance à pas de géant pour mon projet de licence, je te remercie énormément car mon DatagGridview commence à ressembler à quelque chose

Je m’aperçois que ce n'est vraiment pas évident de démarrer, je n'aurai jamais trouvé tous cela tout seul.

MILLE MERCI
jeremyvb11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h52.


 
 
 
 
Partenaires

Hébergement Web