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

VB.NET Discussion :

Colonne calculée dans un DataGridView


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut Colonne calculée dans un DataGridView
    Bonjour le forum je souhaite dans un datagridview faire la multiplication de deux colonnes dont le résultat sera charger dans une colonne créé manuellement
    pour cela j'ai créé la colonne 'Montant'
    quelque recherche sur le forum mont permis de trouver le code ci-dessous
    que j'ai essayer d'adapter à mon cas
    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
    Private Sub dgvSalaire_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvSalaire.CellValueChanged
            'Je récupère la colonne Quantité qui a pour propriété NAME "ColonneQuantité"
            Dim colMultiplicande As DataGridViewColumn = dgvSalaire.Columns(4)
            'Je récupère la colonne Prix Unitaire qui a pour propriété NAME "ColonnePrixUnit"
            Dim colMultiplicateur As DataGridViewColumn = dgvSalaire.Columns(5)
            'Je récupère la colonne Total qui a pour propriété NAME "ColonneTotal"
            Dim colTotal As DataGridViewColumn = dgvSalaire.Columns(6)
            'Sur quelle ligne et colonne se trouve la cellule éditée
            Dim row As Integer = e.RowIndex
            Dim col As Integer = e.ColumnIndex
            'La cellule éditée figure t-elle dans la colonne Quantité ou Prix Unitaire
            If col = colMultiplicande.Index Or col = colMultiplicateur.Index Then
                If dgvSalaire.Item(colMultiplicande.Index, row).Value <> "" And dgvSalaire.Item(colMultiplicateur.Index, row).Value <> "" Then
                    Try
                        'Obtenir le séparateur décimal
                        Dim separateur As String = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
                        'Récupérer les valeurs à multiplier
                        Dim multiplicande As String = dgvSalaire.Item(colMultiplicande.Index, row).Value.ToString
                        Dim multiplicateur As String = dgvSalaire.Item(colMultiplicateur.Index, row).Value.ToString
                        'Mettre le bon séparateur décimal
                        multiplicande = multiplicande.Replace(".", separateur)
                        multiplicande = multiplicande.Replace(",", separateur)
                        multiplicateur = multiplicateur.Replace(".", separateur)
                        multiplicateur = multiplicateur.Replace(",", separateur)
                        'Calculer et Afficher le résultat 
                        dgvSalaire.Item(colTotal.Index, row).Value = CDec(multiplicande) * CDec(multiplicateur)
                    Catch ex As Exception
                        'Gestion des erreurs en cas de saisie incorrecte
                        MessageBox.Show(ex.Message)
     
                    End Try
                Else
                    'La quantité ou le prix unitaire est vide
                    dgvSalaire.Item(colTotal.Index, row).Value = ""
                End If
            End If
        End Sub
    mais au chargement de mon tableau la colonne MONTANT est toujours Vide et je ne comprend pas pourquoi
    Nom : MONTANT.PNG
Affichages : 888
Taille : 9,5 Ko
    Quel qu'un pourrais m'aider?

    Précision le code ci-dessus fonction bien mais je voudrais qu'au chargement du datagridview les cellules des colonnes HORAIRE et TAUX qui contiennent des valeurs calcule automatiquement et affiche le résultat dans la colonne MONTANT or présentement je suis obligé de cliquer sur chaque cellule des colonnes HORAIRE ou TAUX pour voir le résultat afficher dans la colonne MONTANT

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Je te propose d'essayer le code suivant, d'abord une petite fonction pour changer le séparateur décimal si nécessaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Function PointVirgule(ByVal Valeur As String) As String
            Dim Test As String = "1,2"
            Dim TestNum As Single
            Try
                TestNum = CType(Test, Single)
                Test = Valeur.Replace(".", ",")
            Catch ex As Exception
                Test = Valeur.Replace(",", ".")
            End Try
            Return Test
        End Function
    Bien sûr, il est toujours possible de changer les paramètres régionaux de Windows ou bien de régler les paramètres de "Culture" du programme (des "ténors" du forum ne manqueront pas de signaler ces détails), mais ma fonction règle le problème quels que soient les réglages de ces paramètres, sans même que nous nous en préoccupions.

    Ensuite, pour ta multiplication, le code suivant devait faire l'affaire. Sans doute est-il prudent de le placer dans un Try pour le cas où des cellules concernées du DatagridView seraient vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Dim Facteur1 As Double
        Dim Facteur2 As Double
        Dim IndexColFact1 As Integer
        Dim IndexColFact2 As Integer
        For R As Integer = 0 To LeDataGridView.Rows.count - 1
            IndexColFact1 = LeDataGridView.Columns("NomDeLaColonneDeFact1").Index
            IndexColFact2 = LeDataGridView.Columns("NomDeLaColonneDeFact2").Index
            Facteur1 = CType(PointVirgule(LeDataGridView.Item(IndexColFact1, R).Value), Double)
            Facteur2 = CType(PointVirgule(LeDataGridView.Item(IndexColFact2, R).Value), Double)
            LeDataGridView.Item(LeDataGridView.Columns("NomDeLaColonneMontant").Index, R).Value = Facteur1 * Facteur2
        Next
    J'espère que ça t'aidera ...

  3. #3
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Salut Phil Rob sa marche grand merci
    mais il y'a juste la partie des séparateurs décimal qui me génère toujours une erreur lorsque je met point dans une cellule au lieu de la virgule

  4. #4
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut
    On pourrait envisager un object Excel à la place d'un DataGridView classique si les calculs deviennent plus complexes.
    Au sujet de la conversion du point décimal, je proposerais de retirer toute virgule car dans le monde anglo-saxon on ajoute souvent un séparateur virgule des milliers, millions etc.
    Exemple à éventuellement mettre dans une boucle, ici pour une seule virgule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                Dim p As Integer = InStr(Str, ",")
                Str = Left(Str, p - 1) & Right(Str, l - p)

  5. #5
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Excuse, je vois seulement maintenant ton message.

    Envoie l'extrait de code où tu as une erreur à cause du séparateur décimal, si le calcul est bon alors l’erreur est ailleurs. Il faut savoir que pour calculer, VB ne connait que le point, quel que soit le paramètre régional.
    Ma fonction PointVigule peut aussi servir à modifier les valeurs affichées en fonction du paramètre régional : si tu veux seulement que le calcul s'exécute, alors tu peux remplacer l'appel de la fonction par le Replace seul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim R As Double = CType(PointVigule(ChaineValeur1), Double) * CType(PointVigule(ChaineValeur2), Double)
     
    'est équiavlent à :
     
    Dim R As Double = CType(ChaineValeur1.Replace(",", "."), Double) * CType(ChaineValeur2.Replace(",", "."), Double)  ' quel que soient les paramètres régionaux, et quel que soit le séparateur dans la chaine
     
    'Simplement avec PointVirgule, tu aussi faire ceci :
     
    UnTextBox.Text  = PointVirgule(UnTextBox.Text)  ' pour mettre l'affichage en accord avec les paramètres régionaux du PC

  6. #6
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonsoir Phil Rob
    le problème à mon avis n'est pas au niveau du code mais plutôt du datagridview car c'est au moment de l'insertion d'un nombre dans une cellule de datagridview si je sépare la partie décimal par un point là j'obtient l'erreur mais si je sépare la partie décimal par une virgule là sa marche sans problème
    Nom : CaptureGGGG.PNG
Affichages : 903
Taille : 49,3 Ko

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    J'en déduis que ton DataGridView est lié à la DB (DataGridView.DataSource = ....) et qu'il y a effectivement un paramétrage régional qui te gêne.

    Là ma fonction peut t'aider en remplaçant la valeur encodée par le résultat de ma fonction :

    DataGridView.Item(ColonnedeLaCellule, LignedeLaCellule).Value = PointVirgule(DataGridView.Item(ColonnedeLaCellule, LignedeLaCellule).Value) .

    Cependant, pour que cette ligne de code fonctionne, il te faut pouvoir intercepter l'erreur, peut-être en travaillant dans la procédure événementielle
    DataGridView1_CellValueChanged et en utilisant un Try.

    Tu peux aussi me communiquer ton code, ou au moins les extraits qui concerne le DataGridView, j'aurai sans doute du temps demain soir.

  8. #8
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Le code que tu m'a proposer fonctionne bien j'ai juste modifier pour adapter a mon cas et effectivement mon DataGridview est lié à une source de données car je configure les éléments de salaire d'un employé que appel dans ce Datagridview, et ces éléments de salaire peuvent être modifier au besoin avant l'insertion dans la table Salaire.Dans ma es cellules Horaire ou Taux si j'insert un nombre avec comme pour séparateur décimal la ',' je n'es aucun soucis tous fonctionne bien mais par contre si je remplace la ',' par '.' là j'obtient une erreur.
    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
        Private Function Poinvirgule(ByVal valeur As String) As String
            Dim test As String = "1,2"
            Dim testnum As Single
            Try
                testnum = CType(test, Single)
                test = valeur.Replace(".", ",")
     
            Catch ex As Exception
                test = valeur.Replace(",", ".")
            End Try
            Return test
        End Function
        Private Sub calculdatagridview()
            Try
                Dim facteur1 As Double
                Dim facteur2 As Double
                Dim indexcolfact1 As Integer
                Dim indexcolfact2 As Integer
                For R As Integer = 0 To dgvSalaire.Rows.Count - 1
                    indexcolfact1 = dgvElementSalaire.Columns("HORAIRE").Index
                    indexcolfact2 = dgvElementSalaire.Columns("TAUX").Index
                    facteur1 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact1, R).Value), Double)
                    facteur2 = CType(Poinvirgule(dgvElementSalaire.Item(indexcolfact2, R).Value), Double)
                    dgvElementSalaire.Item(dgvElementSalaire.Columns("MONTANT").Index, R).Value = Math.Round(facteur1 * facteur2)
                Next
            Catch ex As Exception
     
            End Try
            dgvElementSalaire.Refresh()
        End Sub

  9. #9
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    et il faut aussi rappeler que même sans code j'obtient la même erreur de séparateur décimal dans une cellule de datagridview

  10. #10
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    J'ai pu produire le même type d'erreur que celle que tu obtiens (DataGrid lié à la DB et type encodé non conforme).
    Je vais donc pouvoir travailler, mais ce ne sera sans doute pas avant la soirée.
    Je te tiens au courant.

    Bonne journée,

    Nom : MemeErreur.jpg
Affichages : 917
Taille : 115,8 Ko

  11. #11
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub DataGridView1_DataError(sender As Object, e As Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
        sender.editingcontrol.text = sender.editingcontrol.text.ToString.Replace(".", ",")
    End Sub

  12. #12
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    La solution proposée par Thumb Down est sans aucun doute la meilleure.

    Personnellement, j'utiliserais ma fonction Poinvirgule de sorte que ça fonctionne toujours si on place l'application là où le séparateur de décimal doit être le point et non la virgule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Private Sub dgvElementSalaire_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dgvElementSalaire.DataError
            sender.editingcontrol.text = Poinvirgule(sender.editingcontrol.text.ToString) 
        End Sub
    Si aucun risque de se trouver face à l'autre séparateur, alors le Replace fait parfaitement l'affaire.


    Bonne soirée,

  13. #13
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    effectivement sa marche merci à vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/05/2008, 08h43
  2. Champs référence et calculé dans un datagridview
    Par amireve dans le forum Débuter
    Réponses: 1
    Dernier message: 24/03/2008, 12h07
  3. Inverser colonnes-lignes dans un datagridview
    Par gazier20 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 13/11/2007, 22h53
  4. colonne calculée dans une table
    Par gicquairea dans le forum WinDev
    Réponses: 6
    Dernier message: 10/10/2007, 06h10
  5. colonne calculée dans une vue
    Par jfc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/04/2006, 16h11

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