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
Utilisateur anonyme - 24 juil. 2017 à 17:18
Utilisateur anonyme - 24 juil. 2017 à 17:18
A voir également:
- Calcul par datagridview VB.NET
- Calcul moyenne excel - Guide
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel calcul surface terrain gratuit - Télécharger - Outils professionnels
- Calcul km marche à pied gratuit - Télécharger - Sport
2 réponses
Utilisateur anonyme
22 juil. 2017 à 13:11
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.
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.
Utilisateur anonyme
22 juil. 2017 à 21:06
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.
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
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
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
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
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
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
Alors si tu utilises une liste de classe, admettons que tu veuilles additionner les toto:
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
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.
- à 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.
Modifié le 22 juil. 2017 à 13:49
Car j'avais entendu parlé que en faisant :
Merci
Cordialement