Problème de calcul total general datagridview

HichSkill Messages postés 3 Date d'inscription samedi 9 décembre 2023 Statut Membre Dernière intervention 10 décembre 2023 - 10 déc. 2023 à 00:46
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 13 déc. 2023 à 14:21

Bonjour,

Lorsque j'insère un sous total dans la datagridview le total général change mais ce Que je ne le veux pas

  Private Sub BtnSum_Click(sender As Object, e As EventArgs) Handles BtnSum.Click
        Dim somme As Double
        For x As Integer = 0 To DgvDevisClent.Rows.Count - 1
            somme += CType(DgvDevisClent.Rows(x).Cells(4).Value, Double)
        Next
        somme = String.Format("{0:##,##0.000}", CDbl(somme.ToString))
        DgvDevisClent.Rows.Insert(DgvDevisClent.CurrentRow.Index + 1, 1)
        DgvDevisClent.CurrentCell = DgvDevisClent.Rows(DgvDevisClent.CurrentRow.Index + 1).Cells(0)
        DgvDevisClent.CurrentRow.Cells(4).Value = somme
        DgvDevisClent.Focus()
    End Sub

J'aurais besoin de votre aide ou vos idées s.v.p.
Merci d'avance pour votre réponse.

7 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
10 déc. 2023 à 09:39

Bonjour

tout d'abord, ce code est écrit en VB, pas en C#, j'ai donc déplacé dans le bon forum,

Ensuite, ce qu'il faudrait faire, c'est calculer sur les objets qui servent à binder le datagridview et pas avec les cellules.

Voir cette introduction en binding avec winform https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource

D'une tu ferais des calculs à partir de nombres, avec des boucles ou avec Linq pour gagner du temps.

Mais en plus tu pourrais ajouter une propriété non affichée qui te permettrait de filtrer tes calculs. Soit avec des if dans les boucles de calculs soit avec des clause de sélection ou d'exception avec Linq.

Par exemple, un enum, dont les valeurs pourrait être article, total_intermediaire et total.

Évidemment ça va t'obliger à revoir la structure de ton programme.

Mais ça t'apprendra à coder correctement en VB.Net (dernière version 2021) et pas en "VB6 like" (dernière version 1999).

Si tu veux rester en VB like, ben je ne sais mettre pas comment te guider


0
HichSkill Messages postés 3 Date d'inscription samedi 9 décembre 2023 Statut Membre Dernière intervention 10 décembre 2023
10 déc. 2023 à 13:23

Bonjour
pardon je suis nouveaux membre

j'ai testé un code que j'ai trouvé sur Internet mais le problème que je n'ai pas la liberté d’insert un sous total a la ligne qu je veux

Sous-Total dans DataGridView

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
10 déc. 2023 à 14:13

Oui, est-ce que tu as lu le tuto sur le binding ?

Est-ce que tu l'as compris ?

Est-ce que tu as compris mon message ?

Parce que si ça n'est pas le cas, il vaut mieux le dire pour que j'essaye d'être plus explicite.

Par ce que changer de sujet (le fait de ne pas avoir le choix de la ligne d'insertion n'est pas le même problème que l'ajout d'un sous total qui fausse le total final) ne fait qu'ajouter du flou à ma compréhension.


0
HichSkill Messages postés 3 Date d'inscription samedi 9 décembre 2023 Statut Membre Dernière intervention 10 décembre 2023
10 déc. 2023 à 16:02

j'ai lu le tuto sur le binding mais est ce que il est possible de travailler en mode déconnecter sans relier au base de donner

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim souTotal As New List(Of Integer) 'liste des sous totaux 
        Dim idSouTotal As New List(Of Integer) 'liste des index d'insertion des sous totaux
        Dim sDate As Date 'la date concernée par le sous total

        Dim total, totalGnl As Integer
        Dim h As Integer = 0 'nbre de sous totaux
        total = 0
        totalGnl = 0 'total générale 
        '/// je fais d'abord un tri sur la colonne date afin de regrouper les dates par ordre alphabétique
        Me.DataGridView1.Sort(Me.DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Ascending)


        For i As Integer = 0 To DataGridView1.RowCount - 1
            If i = 0 Then sDate = CDate(Me.DataGridView1(0, 0).Value) ' Recupération de la 1ère date

            If sDate = CDate(Me.DataGridView1(0, i).Value) Then 'Comparaison de la date recupérée avec celle du datagridview
                'si les deux date sont égales le calcul se poursuit
                total += CInt(DataGridView1.Rows(i).Cells(1).Value)
            Else 'si les deux date ne sont pas égales le procécus suivant :
                h += 1 '                   incrémentation du nombre de sous total

                souTotal.Add(total) '                ajout du sous total à la liste

                idSouTotal.Add(CInt(i + h - 1)) '           ajout de l'index du sous total à la liste

                totalGnl += total  '            total général

                sDate = CDate(Me.DataGridView1(0, i).Value) 'Recupération de la date suivante
                total = 0 'le compteur du sous total à zéro
                total += CInt(DataGridView1.Rows(i).Cells(1).Value)
            End If

            If i = Me.DataGridView1.RowCount - 1 Then 'dernière ligne
                h += 2
                souTotal.Add(total)
                idSouTotal.Add(CInt(i + h - 1))
                totalGnl += total
            End If
        Next

        'insertion des sous totaux dans le tableau
        Dim id As Integer
        For j As Integer = 0 To souTotal.Count - 1 'parcourt des sous totaux
            id = CInt(idSouTotal(j))
            Me.DataGridView1.Rows.Insert(id, 1)
            Me.DataGridView1(0, id).Value = "Total (" & Me.DataGridView1(0, id - 1).Value & ")"
            Me.DataGridView1(1, id).Value = souTotal(j)
        Next
        'insertion du total général dans le tableau
        Me.DataGridView1.Rows.Add()
        Me.DataGridView1(0, Me.DataGridView1.RowCount - 1).Value = "Total général"
        Me.DataGridView1(1, Me.DataGridView1.RowCount - 1).Value = totalGnl
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        DataGridView1.Rows.Add("12/12/2002", 2)
        DataGridView1.Rows.Add("12/12/2002", 1)

        DataGridView1.Rows.Add("12/12/2004", 1)
        DataGridView1.Rows.Add("12/12/2004", 3)

        DataGridView1.Rows.Add("12/12/2005", 1)
        DataGridView1.Rows.Add("12/12/2005", 1)

    End Sub
0

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

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
10 déc. 2023 à 16:13
est ce que il est possible de travailler en mode déconnecter sans relier au base de donner

Oui, c'est même le fonctionnement par défaut puisqu'on utilise des collections d'objets métier.


0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié le 10 déc. 2023 à 19:27

Un exemple.

Je suppose que tes données ont une date, une valeur (comme le montre ton code précédent) et une description.

Je crée donc une classe métier qui correspond, en y ajoutant une propriété enum comme évoqué plus haut

'la classe avec une propriété pour chaque information
Public Class ExempleSousTotal
    Public Property date As DateTime
    Public Property Description As String
    Public Property Valeur As Integer
    Public Property TypeInstance As TypeInstance
End Class

'l'enum, pour lequel je force les valeurs, ce sont les mêmes que celles par défaut, mais si tu n'es pas habitué ça situe les choses
Public Enum TypeInstance
    Indetermine = 0
    ItemImportant = 1
    SousTotal = 2
    TotalFinal = 3
End Enum

Ensuite le code pour "extraire de la BDD", (bon là c'est en brut dans le code, à toi de voir comment tu feras), suivit d'un traitement Linq en plusieurs étapes

  • Regroupement des données selon la date, (tu verras les données sont dans le désordre exprès pour l'exemple)
  • Calcul des sous totaux à partir du regroupement (y'a moyen de s'en passer mais c'est pas plus simple à écrire)
  • Calcul du total final, à partir des sous totaux, mais ça aurait marché pareil à partir de la collection "bdd"
  • Union de la collection "bdd" et de la collection "totaux"
  • Tri de l'union par date, puis par l'énum
  • Binding
'initialisation de la collection "bdd" en brut
Dim lesItemsEnDBB As List(Of ExempleSousTotal) = New List(Of ExempleSousTotal) From {
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 01),
		.Description = "bla bla",
		.Valeur = 3,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 02),
		.Description = "bly bly",
		.Valeur = 7,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 01),
		.Description = "blu blu",
		.Valeur = 2,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 03),
		.Description = "ble bla",
		.Valeur = 9,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 01),
		.Description = "bla bla",
		.Valeur = 1,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 03),
		.Description = "bla ble",
		.Valeur = 6,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 02),
		.Description = "ble ble",
		.Valeur = 4,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 02),
		.Description = "blo blo",
		.Valeur = 5,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 02),
		.Description = "bli bli",
		.Valeur = 6,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 03),
		.Description = "bli bla",
		.Valeur = 11,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 04),
		.Description = "bla blo",
		.Valeur = 12,
		.TypeInstance = TypeInstance.ItemImportant
	},
	New ExempleSousTotal With {
		.date = New DateTime(2023, 12, 03),
		.Description = "bla bli",
		.Valeur = 10,
		.TypeInstance = TypeInstance.ItemImportant
	}
}


'regroupement des donnée par date
Dim regroupementParDate As List(Of IGrouping(Of DateTime, ExempleSousTotal)) = lesItemsEnDBB.GroupBy(Function(x) x.date).ToList()

'calcul des sous totaux
Dim totaux As List(Of ExempleSousTotal) = (From groupement In regroupementParDate Select New ExempleSousTotal With {
	.date = groupement.Key,
	.Description = $"Sous total du {groupement.Key}",
	.Valeur = groupement.Sum(Function(x) x.Valeur),
	.TypeInstance = TypeInstance.SousTotal
	}).ToList()

'calcul du total final
Dim totalFinal As ExempleSousTotal = New ExempleSousTotal With {
	.date = DateTime.Now,
	.Description = "Total final",
	.Valeur = totaux.Sum(Function(x) x.Valeur),
	.TypeInstance = TypeInstance.TotalFinal
	}

'ajout du total final à la collection des totauxtotaux.Add(totalFinal)

'binding de l'union des données triée
exempleSousTotalBindingSource.DataSource = lesItemsEnDBB.Union(totaux).OrderBy(Function(x) x.date).ThenBy(Function(x) x.TypeInstance)

0
salue
merci de votre réponse
j'ai remplacer (exempleSousTotalBindingSource) par un datagridview
j'ai tester le code mais ça ne marche pas
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
Modifié le 13 déc. 2023 à 14:25
j'ai remplacer (<span>exempleSousTotalBindingSource</span>) par un datagridview
j'ai tester le code mais ça ne marche pas

D'une part,  exempleSousTotalBindingSource est important, voir le tuto.

D'autre part, "ça ne marche pas" ne me permets absolument pas de t'aider. D'autant que chez moi ça marche (je ne l'aurais pas posté sinon....)

  • Que se passe t il?
  • En quoi c'est différent de ce que tu attends?
  • Y'a t il un message d'erreur  ? Si oui
    • Le retranscrire
    • A quelle ligne ?
    • Que valent les variables?
0
Rejoignez-nous