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
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
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.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionest 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.
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
'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)
salue
merci de votre réponse
j'ai remplacer (exempleSousTotalBindingSource) par un datagridview
j'ai tester le code mais ça ne marche pas
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....)