none
Faire des calculs dans un datagridview RRS feed

  • 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

    samedi 10 septembre 2011 13:23

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
    dimanche 11 septembre 2011 15:52
    Modérateur

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
    samedi 10 septembre 2011 20:28
    Modérateur
  • 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 datatable

        Public 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

    dimanche 11 septembre 2011 07:15
  • 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
    dimanche 11 septembre 2011 09:31
    Modérateur
  • Bonjour

    Le temps d’exécution de la boucle

    For RowNum = 0 To NbEcriture - 1
    ....
    Next
    dans la sub
    Sub remplir_grille()
    retourne {00:00:01.1936889}

    Merci pour vos reponses

    Fabrice

     

    dimanche 11 septembre 2011 10:55
  • 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
    dimanche 11 septembre 2011 11:10
    Modérateur
  • 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

     

     

     

    dimanche 11 septembre 2011 14:48
  • 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
    dimanche 11 septembre 2011 15:52
    Modérateur
  • Bonjour,

    Merci pour votre aide, ça fonctionne.

     

    Fabrice

    dimanche 11 septembre 2011 16:29