Meilleur auteur de réponses
Faire des calculs dans un datagridview

Question
-
Bonjour,
J'ai une base de donnée que je charge par code
Dim Table As DataTable ctn = New SqlCeConnection ctn.ConnectionString = ConnectionString ctn.Open() cmd = New SqlCeCommand cmd.Connection = ctn cmd.CommandText = "SELECT Id, Compte, Date, Type, VersCompte, Numero, Designation, Montant, Categorie, Pointe " & _ "FROM Ecritures " & _ "WHERE (Compte = '" & Ecr.m_Ecr_Compte.ToString & "') ORDER BY Date" ds = New DataSet da = New SqlCeDataAdapter da.SelectCommand = cmd da.Fill(ds, "Ecritures") Table = ds.Tables("Ecritures") ctn.Close() Return Table
Et je veux ajouter une colonne TOTAL qui va additionner le montant de la ligne au total de la ligne précédente.
J'y arrive sans problème a le faire dans une boucle sur la table et en faisant les calculs voulus, mais voila pour afficher 160 lignes, c'est très long, plus de trois seconde. Comment faire pour que ce soit quasi instantané.
Merci d'avance pour vos réponses.
Fabrice
Réponses
-
Bonjour,
Travaillez sur votre DataTable.
Faites un Clear sur votre DataTable : monDatatable.Rows.Clear()Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCITP : SQL Server 2008 Developper
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5- Marqué comme réponse Fabrice_51 dimanche 11 septembre 2011 16:29
Toutes les réponses
-
Bonjour,
Pouvez-vous nous montrer l'algo de calcul utilisé ?
Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5 -
Bonjour,
Voici le code qui rempli ma grille
Public Sub remplir_grille() '------------------------------------------------------ ' Remplir la grille des écritures du compte '------------------------------------------------------ Dim dte_ecriture As DataTable Dim NbEcriture As Integer Dim RowNum As Integer Dim rownum1 As Integer = -1 Dim RPointe As Boolean Dim RDate As String Dim RNumero As String Dim RType As String Dim RDesignation As String Dim RCategorie As String Dim RMontant As Double Dim RId As Guid Ecr.m_Ecr_Compte = Compte_Courant Solde_Fin_Mois = Com.m_Com_Solde Date01 = Mid(DateTimePicker1.Value, 7, 4) & "-" & Mid(DateTimePicker1.Value, 4, 2) & "-" & Mid(DateTimePicker1.Value, 1, 2) Date02 = Mid(DateTimePicker2.Value, 7, 4) & "-" & Mid(DateTimePicker2.Value, 4, 2) & "-" & Mid(DateTimePicker2.Value, 1, 2) Grd_Comptes.Rows.Clear() Grd_Comptes.Visible = False Try dte_ecriture = Ecr.LitEcrituresparCompteEntreDate NbEcriture = Ecr.LitEcrituresparCompteEntreDate.Rows.Count For RowNum = 0 To NbEcriture - 1 If dte_ecriture.Rows(RowNum).Item("Type") <> "VERSEMENT" Then Solde_Fin_Mois -= dte_ecriture.Rows(RowNum).Item("Montant") End If If dte_ecriture.Rows(RowNum).Item("Type") = "VERSEMENT" Then Solde_Fin_Mois += dte_ecriture.Rows(RowNum).Item("Montant") End If With dte_ecriture.Rows(RowNum) RPointe = .Item("Pointe") RDate = .Item("Date") RNumero = .Item("Numero") RType = .Item("Type") RDesignation = .Item("Designation") RCategorie = .Item("Categorie") RMontant = FormatNumber(.Item("Montant") / 100) RId = .Item("Id") End With With Grd_Comptes If (CheckBox3.Checked = RPointe) Or RPointe = False Then .Rows.Add() rownum1 = rownum1 + 1 .Item(0, rownum1).Value = FormatDateTime(RDate, DateFormat.ShortDate) .Item(1, rownum1).Value = RNumero .Item(2, rownum1).Value = RType .Item(3, rownum1).Value = RDesignation .Item(4, rownum1).Value = RCategorie .Item(5, rownum1).Style.Alignment = DataGridViewContentAlignment.MiddleRight .Item(5, rownum1).Style.Format = "### ##0.00" If RType <> "VERSEMENT" Then .Item(5, rownum1).Value = RMontant End If .Item(6, rownum1).Style.Alignment = DataGridViewContentAlignment.MiddleRight .Item(6, rownum1).Style.Format = "### ##0.00" If RType = "VERSEMENT" Then .Item(6, rownum1).Value = RMontant End If .Item(7, rownum1).Style.Alignment = DataGridViewContentAlignment.MiddleRight .Item(7, rownum1).Value = FormatNumber(Solde_Fin_Mois / 100) If RPointe = True Then .Item(8, rownum1).Value = "P." Else .Item(8, rownum1).Value = "" End If .Item(9, rownum1).Value = RId End If End With Next Affiche_Soldes() Catch ex As Exception Throw ex End Try Grd_Comptes.Visible = True End Sub
Et la fonction qui rempli la datatablePublic Function LitEcrituresparCompteEntreDate() As DataTable Dim Table As DataTable ctn = New SqlCeConnection ctn.ConnectionString = ConnectionString ctn.Open() cmd = New SqlCeCommand cmd.Connection = ctn cmd.CommandText = "SELECT Id, Compte, Date, Type, VersCompte, Numero, Designation, Montant, Categorie, Pointe " & _ "FROM Ecritures " & _ "WHERE (Compte = '" & Ecr.m_Ecr_Compte.ToString & "') AND (Date >= CONVERT(DATETIME, '" & Date01 & " 00:00:00', 102) AND Date <= CONVERT(DATETIME, '" & Date02 & " 00:00:00', 102)) ORDER BY Date" ds = New DataSet da = New SqlCeDataAdapter da.SelectCommand = cmd da.Fill(ds, "Ecritures") Table = ds.Tables("Ecritures") ctn.Close() Return Table End Function
Fabrice -
Bonjour,
Je ne vois rien d'anormal.
Pouvez-vous essayer d'utiliser la classe Stopwatch afin d'isoler la partie du code qui pose problème ?Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5 -
-
Bonjour,
Avez-vous essayé de travailler plustôt sur le DataTable de votre DataSet et non sur le DataGridView ?
Il suffit d'ajouter une colonne dans le DataTable, de réaliser les calculs dans cette dernière et d'afficher cette colonne dans votre DataGridView.Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5 -
Bonjour,
Je vous remercie de votre reponse, j'arrive a ajouter une colone, faire les calculs et affiche les doonées simplementpar la fonction
Grd_Comptes.DataSource = dte_ecriture
Si je veux modifier l'affichage et voir que 3 lignes, pour effacer les lignes j'utilise
Grd_Comptes.Rows.Clear()
j'ai une erreur: impossible d’effacer cette liste. Et pourtant la valeur de rows est de 162.
Merci pour vos reponses et votre temps.
Fabrice
-
Bonjour,
Travaillez sur votre DataTable.
Faites un Clear sur votre DataTable : monDatatable.Rows.Clear()Cordialement
Gilles TOURREAU - MVP C#
Architecte .NET/Consultant/Formateur chez Winwise
Blog : http://gilles.tourreau.fr
- MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
- MCITP : SQL Server 2008 Developper
- MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5- Marqué comme réponse Fabrice_51 dimanche 11 septembre 2011 16:29
-