IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Optimiser affichage données dans un datagrid


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Par défaut Optimiser affichage données dans un datagrid
    Bonjour
    Je souhaiterais avoir votre avis pour améliorer mon code.
    Je débute en vb.net mais mon code marche, je souhaite simplement améliorer et savoir si j'utilise la meilleure méthode.
    J'ai simplifié mon code en gardant que les grandes lignes, mais en gros, ma base de données contient environ 15000 lignes avec une vingtaine de colonnes.
    J’affiche mes données dans un datagrid, dans chaque ligne il y a des icônes, des combobox, des cellules de couleurs différentes
    J’affiche mes lignes au fur et à mesure du scroll mais l'actualisation de l'affichage n'est pas très fluide et rapide,

    Je parcourant le net j’ai peut-être plusieurs pistes pour améliorer :
    utiliser un dataAdapteur au lieu du datareader
    utiliser le virtualmode ?

    Voilà si quelqu’un peut me donner des conseils ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Sub Lecture_DataBase()
     
        Dim Connection As New OleDb.OleDbConnection()
        Dim DataReader As OleDbDataReader
     
        Connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Chemin_DataBase & Fichier_DataBase
        Connection.Open()
     
        Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM `PRODUITS`", Connection)
        DataReader = cmd.ExecuteReader
     
        While DataReader.Read()
            tableProduit.Rows.Add()
            tableProduit.Rows(tableProduit.Rows.Count - 1).Item("path") = DataReader("path").ToString
            tableProduit.Rows(tableProduit.Rows.Count - 1).Item("description") = DataReader("description").ToString
            tableProduit.Rows(tableProduit.Rows.Count - 1).Item("fournisseur") = DataReader("fournisseur").ToString
            tableProduit.Rows(tableProduit.Rows.Count - 1).Item("type") = 1
        End While
        Connection.Close()
     
        LigneEcriture = 0
        Affichage_DataGrid()
    End Sub
     
    Private Sub DataGridView1_Scroll(sender As Object, e As ScrollEventArgs) Handles DataGridViewMain.Scroll
        If e.ScrollOrientation = ScrollOrientation.VerticalScroll Then
            Dim displayedRowsCount As Integer = DataGridViewMain.DisplayedRowCount(True)
            Dim firstDisplayedRowIndex As Integer = DataGridViewMain.FirstDisplayedScrollingRowIndex
            Dim missingRowsCount As Integer = 90
            If firstDisplayedRowIndex + displayedRowsCount >= LigneEcriture Then Affichage_DataGrid()
        End If
    End Sub
     
     
    Sub Affichage_DataGrid()
     
        With Main.col0 : .HeaderText = "" : .Name = "N1" : .Width = 25 : .Visible = True : .SortMode = DataGridViewColumnSortMode.NotSortable : End With
        With Main.col1 : .HeaderText = "path" : .Name = "path" : .Width = 250 : .Visible = True : .SortMode = DataGridViewColumnSortMode.NotSortable : End With
        With Main.col2 : .HeaderText = "description" : .Name = "description" : .Width = 250 : .Visible = True : .SortMode = DataGridViewColumnSortMode.NotSortable : End With
        With Main.col9 : .HeaderText = "fournisseur" : .Name = "fournisseur" : .Width = 100 : .Visible = True : .SortMode = DataGridViewColumnSortMode.NotSortable : End With
     
        If tableProduit.Rows.Count - 1 < LigneEcriture + 49 Then
            max = tableProduit.Rows.Count - 1
        Else
            max = LigneEcriture + 49
        End If
     
        For t = LigneEcriture To max
     
            Main.DataGridViewMain.Rows.Insert(LigneEcriture)
     
            If tableProduit.Rows(t).Item("type") = 1 Then Main.DataGridViewMain.Rows(LigneEcriture).Cells("N1").Value = My.Resources.ZC_img_asm
     
            Main.DataGridViewMain.Rows(LigneEcriture).Cells("path").Value = tableProduit.Rows(t).Item("path")
            Main.DataGridViewMain.Rows(LigneEcriture).Cells("description").Value = tableProduit.Rows(t).Item("description")
            Main.DataGridViewMain.Rows(LigneEcriture).Cells("fournisseur").Value = tableProduit.Rows(t).Item("fournisseur")
     
            If Not IO.File.Exists(tableProduit.Rows(t).Item("path").ToString) Then Main.DataGridViewMain.Rows(LigneEcriture).Cells("path").Style.BackColor = Color.FromArgb(255, 200, 200) End If
     
            LigneEcriture = LigneEcriture + 1
        Next
    End Sub

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    le virtualmode permet en effet de mettre des centaines de milliers de lignes sans ralentissements
    ca fait un peu de code à taper par contre (un event est levé à chaque fois qu'une cellule veut son contenu, donc il faut chercher dans sa collection interne pour lui donner la valeur (les lignes sont ajoutées à blanc))
    et donc à chaque que tu vas scroller ca va lever l'event des dizaines de fois
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    1) Premièrement, je ne comprends pas pourquoi vous tirez la totalité de la table pour la rapatrier vers le client.
    Est-ce que l'utilisateur final a vraiment besoin de consulter l'ensemble des données et scroller ces 15000 rows ??
    Il me semble plus rationnel d'utiliser un filtre de recherche, dont le critère peut être le fournisseur par exemple.
    Comme ça, vous filtrez les données à la source et allégez les requêtes.

    Il faut se représenter la charge que ça représente pour le serveur de DB, plus le volume de données qui doit transiter via le réseau, et enfin la charge pour le rendering au niveau de l'UI.

    Quand on parle de sobriété énergétique, il faudrait commencer par optimiser la consommation de données

    2) D'autre part, la manière de travailler avec le DataReader n'est pas bonne: on ne s'amuse pas à alimenter un datatable ligne par ligne comme vous le faites.
    On lit une source de données, on assigne le résultat de la requête à un datatable, et puis on spécifie que le datatable résultant sert de datasource au datagridview.

    Un exemple à l'arrache: http://vb.net-informations.com/dataa...view-oledb.htm ou bien ici: http://www.java2s.com/Tutorial/VB/04...taGridView.htm

    3) Quant au formatage des cellules, il est préférable d'utiliser les événements Paint du datagridview. D'ailleurs je pense que si vous triez les colonnes, votre formatage fout le camp.

    4) Faire If Not IO.File.Exists dans une boucle est de nature à ralentir le processus aussi.

    Bref, il y a de nombreuses pistes d'amélioration.

  4. #4
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 736
    Par défaut
    Bonjour,

    Un bon moyen d'éviter les soucis d'affichage quand il y a beaucoup de données (parfois on a pas le choix), c'est d'utiliser le DoubleBuffering.
    Çà évite les saccades, et fluidifie le défilement.
    Dire que cette technique date de mon vieil Amiga

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Par défaut
    Bonsoir,

    Merci à tout les trois pour vos réponses.
    Il va me falloir un peu de temps pour tous essayer !
    Mais je viens de tester rapidement le "DoubleBuffering" et j'ai déjà une nette amélioration de fluidité.

    Merci beaucoup !

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    1) Premièrement, je ne comprends pas pourquoi vous tirez la totalité de la table pour la rapatrier vers le client.
    Est-ce que l'utilisateur final a vraiment besoin de consulter l'ensemble des données et scroller ces 15000 rows ??
    Il me semble plus rationnel d'utiliser un filtre de recherche, dont le critère peut être le fournisseur par exemple.
    Comme ça, vous filtrez les données à la source et allégez les requêtes.
    En effet c'est rare d'en avoir besoin, mais dans certains cas, c'est bien de voir un peu toutes les données affichées, puis de scroller un peu, ca donne une idée de ce qu'il y a (sur du log par exemple)
    et après on filtre, et les filtres étant en ram c'est instantané et ca permet de travailler un bout de temps sur ses données plutot que de faire 50 aller retour réseau qui au final auront quand même ramené surement beaucoup de données ^^

    Citation Envoyé par binarygirl Voir le message
    2) D'autre part, la manière de travailler avec le DataReader n'est pas bonne: on ne s'amuse pas à alimenter un datatable ligne par ligne comme vous le faites.
    On lit une source de données, on assigne le résultat de la requête à un datatable, et puis on spécifie que le datatable résultant sert de datasource au datagridview.
    Après alimenter un datatable ca fait quand même un while datareader.read
    après si tableProduit est un datagridview en effet c'est parfois dommageable de remplir un objet graphique avec des données pendant la lecture (pas toujours, en winforms par exemple c'est souvent rafraichit une seule fois à la fin)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Par défaut
    J'ai un peu exagéré quand je dit 15000 lignes, car effectivement, je filtre un minimum avec ma requête sql.
    Mais je dois quand même charger beaucoup de données dans ma tableProduit, car je fais des calculs.
    Et afficher ligne par ligne avec le DataReader me semble plus facile pour personnaliser chaque lignes car je crée une sorte d'arborescence avec des lignes parentes et enfants.
    Avec l'autre méthode, si j'ai bien compris, il va falloir que je mets en forme d'abord ma tableProduit pour l'afficher d'un seul coup.
    Je vais faire des tests avec un timer pour voir si j'obtiens un gain de temps.

    Merci pour tous vos conseils en tous cas !

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    c'est selon ce que tu fais sur tes données, mais une base de données sera souvent plus efficace pour traiter tout en bloc (surtout en cas de jointures)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Affichage de données dans un DataGrid en WPF
    Par LIANAZEL dans le forum C#
    Réponses: 1
    Dernier message: 13/05/2016, 17h16
  2. Probleme affichage données dans datagrid
    Par maxwel56 dans le forum Silverlight
    Réponses: 2
    Dernier message: 17/02/2010, 21h00
  3. Réponses: 3
    Dernier message: 01/06/2006, 19h45
  4. [SQL] Moteur de recherche problème affichage donnée dans select
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 07/04/2006, 20h27
  5. [SQL-Server] Pb affichage données dans tableau
    Par steve o'steen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 14/03/2006, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo