Calcul par datagridview VB.NET

Fermé
Technologie_019 Messages postés 14 Date d'inscription mardi 18 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017 - Modifié le 22 juil. 2017 à 12:23
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 - 24 juil. 2017 à 17:18
Bonjour,

Je voudrais savoir comment faire pour calculer plusieurs chiffres qui sont inscrit dans un datagrid view mais qui sont dans la même colonne (verticalement)
Exemple : DatagridView1.Collums(4) donc pour être compris c'est la 5 colonne en partant de la gauche dans le datagridview
Merci,
Cordialement.
A voir également:

2 réponses

Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
22 juil. 2017 à 13:11
Bonjour

Faire des calculs dans le datagridview est assez chiant. Il faut extraire le texte de chaque cellule, le convertir en nombre, calculer, convertir le résultat en string...

Pour le coup, le tuto que je t'ai donné hier te donne une solution plus simple.
Tu mets une propriété en lecture seule dans la classe qui retourne le résultat de ton calcul et le binding se débrouille pour l'affichage.
Non seulement c'est économe en lignes de code, mais c'est plus dans l'esprit de VB.Net.
0
Technologie_019 Messages postés 14 Date d'inscription mardi 18 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
Modifié le 22 juil. 2017 à 13:49
Merci, mais le souci c'est que je n'ai aucun binding car j'ai oublié de préciser ce n'est pas vraiment une base de donnée c'est juste des données qui sont dans un bloc note auquel je l'ai fais affiché dans le dgv par la suite

Car j'avais entendu parlé que en faisant :
Do while (i < (DGV.Columns(4).quelque chose -1)) 
(Et la un code pour récupérer toute les valeurs qui sont compris dans la colonne 5)
Loop

Merci
Cordialement
0
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
22 juil. 2017 à 21:06
mais le souci c'est que je n'ai aucun binding

Ce n'est pas parce que tu as "mal" commencé ton projet que tu es obligé de continuer ;).

Supposons que ton calcule utilise la colonne 3 et la 5, et que le résultat est affiché dans la 8.

Il faut d'abord que tu "surveilles" quelle cellule vient de changer de valeur, en t'abonnant par exemple à l'évènement CellEndEdit.
De cet évènement, tu peux récupérer le numéro de ligne et de colonne de la cellule qui vient d'être éditée. Si le numéro de colonne est 3 ou 5, alors il faut lire les contenus des cellules 3 et 5 de la ligne éditée, les convertir en nombre, faire le calcul, convertir le résultat en string et enfin le mettre dans la cellule 8 de la ligne éditée.

Avec une classe, dont une liste est bindée, tu n'as pas à te préoccuper de convertir du texte en nombre et des nombres en texte, c'est le binding qui le fait pour toi. Tu n'as pas non plus à te demander quelle ligne est éditée, le binding ira modifier directement la bonne instance. Tu n'as donc qu'à prévoir de mettre à jour ton calcul quand une propriété est modifiée, et signaler ce changement.

option 1
Class Test
        Implements INotifyPropertyChanged


        Private privateToto As Double

        Public Property Toto As Double
            Get
                Return privateToto
            End Get
            Set(ByVal value As Double)
                privateToto = value
                Calcul() 'quand y'a une modif, on calcule
            End Set
        End Property

        Private privateTata As Double

        Public Property Tata As Double
            Get
                Return privateTata
            End Get
            Set(ByVal value As Double)
                privateTata = value
                Calcul() 'quand y'a une modif, on calcule
            End Set
        End Property

        Private privateTutu As Double
        Public Property Tutu As Double
            Get
                Return privateTutu
            End Get
            Private Set(ByVal value As Double)
                privateTutu = value
            End Set
        End Property

        Private Sub Calcul()
            Tutu = privateTata * privateToto
            SignalePropertyChanged("Tutu") 'apres le calcul on signale le changement
        End Sub

        Public Event PropertyChanged As PropertyChangedEventHandler

        Private Sub SignalePropertyChanged(ByVal Propriete As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propriete))
        End Sub

    End Class


option 2
  class Test :INotifyPropertyChanged
    {


        private double privateToto;

        public double Toto
        {
            get { return privateToto; }
            set 
            { 
                privateToto = value;
                SignalePropertyChanged("Tutu");//puisque tutu fait le calcule, on signale qu'il a changé
            }
        }
        
        private double privateTata;

        public double Tata
        {
            get { return privateTata; }
            set 
            { 
                privateTata = value;
                SignalePropertyChanged("Tutu");//puisque tutu fait le calcule, on signale qu'il a changé
            }
        }

        public double Tutu { get { return privateToto * privateTata; } }

         public event PropertyChangedEventHandler PropertyChanged;

        private void SignalePropertyChanged(string Propriete)
        {
            if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete));
        }
    }


Ça fait aussi pas mal de ligne, mais:
  • ça applique le principe MVC selon lequel l'interface graphique sert d'interface graphique et les classes "métier" font le métier.
  • c'est plus simple de faire des calculs sur des nombres, avec des propriétés dont le nom a un sens (évidemment Tata, Toto Tutu, n'en ont pas, mais la DateNaissance d'une personne, ou le NombreRoues d'un véhicule si).
  • Le jour où tu dois afficher une infos supplémentaire entre la colonne 2 et 3, tu n'as pas à mettre à jour tous les index de colonne supérieurs à 2 dans les calculs, tu ajoutes une propriétés, et tu demandes au binding de placer la colonne qui la représente au bon endroit.
  • Si un jour tu faits du WPF t'auras pas le choix.


0
Technologie_019 Messages postés 14 Date d'inscription mardi 18 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
22 juil. 2017 à 21:56
Bonsoir,

Je t'avourai vraiment que là je suis plus je voudrais juste un renseignement bon après c'est peu être car c'est le soir que je capte plus LOL
mais alors est ce que avec ce que tu m'as donné cela fonctionnerai avec le Windows Form car bon je sais déjà que ce n'est pas le même code utilisé mais après si tu me répond oui alors je trouverai un moyen de convertir tout ça mais bon après les calculs ne sont pas dans la colonne 3 et 5 comme l'exemple que ta donné mais que dans la colonne 4 c'est de haut en bas que je voudrais faire le calcul et ensuite l'affiché dans un label n'y aurait pas un moyen plus simple avec les informations que je viens de fournir ? ;)

En tout cas un très très grand merci des réponses ;)
Cordialement, Bonne soirée
0
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
22 juil. 2017 à 22:31
Bien sûr que ça marche avec Winform.

Quand tu dis que tu veux calculer de haut en bas, tu veux par exemple additionner toutes les valeurs, ou alors sur n valeurs successives, ou une sur deux.
Peux tu être plus précis?
0
Technologie_019 Messages postés 14 Date d'inscription mardi 18 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
24 juil. 2017 à 13:58
Bonjour,
Merci et désolé pour ce temps mis
Alors moi cela serait additionner toutes les valeurs de haut en bas et une fois la somme effectué l'affiché dans un label (les calculs auront des virgules comprise cela sont des floats)

Cordialement, merci
0
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
24 juil. 2017 à 17:18
Alors si tu utilises une liste de classe, admettons que tu veuilles additionner les toto:
  • à l'ancienne

float somme = 0f;
foreach(Test test in LesTests)
{
   somme += test.Toto;
}

Label1.Text = somme.ToString();
  • avec Linq Framework 3.5 ou supérieur (2008)

Label1.Text = LesTests.Sum(x => x.Toto).ToString();
Ça revient au même, mais ça tient sur une ligne et normalement c'est exécuté plus vite.


Avec le datagridview
float somme = 0f;
foreach(DataGridViewRow r in Dga.Rows)
{
       float valeur = Convert.ToSingle( Rows.Cells[2]).Value;
       somme += valeur'
}
Label1.Text = somme.ToString();


J'ai tapé de tête, sur ma tablette, y a peut être des petites coquilles.
Dans le cas du datagridview, on accède à un contrôle, c'est toujours plus long, ensuite on fait une conversion, on calcule et enfin on affiche.
Dans le cas de Linq, pas de conversion, puisque la propriété de la classe est un nombre, on calcule et affiche d'un coup.
0