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 :

Datagridview long à charger


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut Datagridview long à charger
    Bonjour

    Je fais un programme avec 2 datagridview qui sont liées. Si je clique sur un ligne du premier datagrid, le deuxième affiche d'autre information

    De plus pour remplir la premiere un peu choirsir via des boutons si on affiche des données traitées, non traitées, ou toute la base.

    Hors quand il y a beaucoup de données dans l'une de ces catégories la datagrid est longues à se remplir, environ 11 secondes.

    Voici le code de remplissage de la datagrid
    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
     
     ''' <summary>
        ''' Rempli un controle datagrid pour afficher les données de la base
        ''' </summary>
        ''' <param name="control">represente la datagrid</param>
        ''' <param name="table">table à afficher</param>
     
        Public Sub Rempli(ByVal control As DataGridView, ByVal table As String)
     
            oDA = New OleDbDataAdapter(sql, strConnection) 
            oDs1 = New DataSet() 
            bind = New BindingSource()
            oDA.Fill(oDs1, table) 
            bind.DataSource = oDs1.Tables(table)
            control.DataSource = bind         '
        End Sub
    Y'a-t-il une moyen que ce ne soit pas long

    Merci d'avance

  2. #2
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    as-tu pense au Paging ???

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    non je ne connais pas.
    Tu peux expliquer

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il veut dire que tu peux utiliser une requete qui ne retourne qu'une partie des données et avec un bouton, on voir la suite
    un peu comme sur les pages web en gros

    mais les windows forms permettent plus de choses en théorie
    en pratique aussi mais c'est pas aussi simple qu'un dataset qu'on fill en 2 lignes

    le dataset ests un objet lent et lourd en poids, donc soit stocker ca autre part à la main, soit faire de l'asychrone (la propriété virtualmode du datagridview pourrait t'en dire plus)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    tu es en web ou winform??

    aussibien que pour le web ou winform
    l'utilisation d'un datareader ameliora les perfomances.

    si tu retourn bcp de donnees + 100 (bcp car non user Friendly)
    pense a rajouter un system de filtre.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    enfin c'est dommage d'utiliser du com sur du .net
    surtout que c'est faisable en .net d'avoir un datagrid rapide, j'en ai développer un auquel on peut fournir plusieurs milliers de ligne et qui est utilisable dans la demie seconde

    le datareader accélère en effet, mais ca dépend aussi du stockage, il faut éviter d'utiliser les datatable (datacolumn et datarow) qui ne font pas que stocker les valeurs, et donc qui sont plus lent
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 284
    Points : 94
    Points
    94
    Par défaut
    j'en ai développer un auquel on peut fournir plusieurs milliers de ligne et qui est utilisable dans la demie seconde
    Qu'est ce que tu utilises pour remplir si rapidement ton Datagridview ca m'intéresse?


    Merci

  8. #8
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Bonjour tous le monde,

    j'en ai développer un auquel on peut fournir plusieurs milliers de ligne et qui est utilisable dans la demie seconde
    Oui sperot, tu m'en a déjà parler dans un autre poste, vu que tu utilise DataReader et SqlCommand, moi jusqu'a présent, je n'ai pas vraiment de problème pour charger mes DataGridView's en utilisant des DataSet, mais je sais que je m'approche de certain traitements gourments en ressources. enfin voilà, ca m'interesse aussi.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Je suis en winform.
    Je vais essayer avec la datareader.
    Mon datagridview atteint les 800 lignes pour le test mais il peut atteindre plus.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Et comment tu fais pour le remplir avec la datareader ?

  11. #11
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Pour le DataReader, fais un petit tour là :

    http://dotnet.developpez.com/articles/ado1/vbnet/

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    je sais ce qu'est un datareader mais pour ajouter son contenu à la datagridview tu fais comment ?

  13. #13
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    C'est ma question aussi !

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    recette pour un datagridview asynchrone :

    prenez un datareader, un tableau ou une collection pour les données, ajoutez y une pincée de thread accompagné de ses délégués ^^

    plus sérieusement:

    affichage :
    il faut mettre le datagridview en mode virtuel, dès qu'une cellule devient visible, le datagrid vous demande ce qu'il doit afficher dedans en vous donnant x et y

    remplissage :
    démarrer un thread qui fait execute reader et pendant le while reader.read on remplit ce qu'on trouve dans un objet pas gourmand, nous on a pris un list(Of object()) (le list of pour les lignes et le tableau d'object pour les colonnes) mais un array d'array irait surement aussi
    et toutes les x lignes chargés, on appelle une sub qui se rapelle via un délégué sur le thread principal
    cette sub modifie le nombre de lignes visibles en fonction du nombre de lignes présentes dans le list of
    en mode virtuel, faire dgv.rows.add(1000) ajoute 1000 lignes mais vide donc c'est instantané, et le scrollbar apparait

    il reste aussi la partie création physique des colonnes et plein d'autres choses possibles

    et au passage on a encapsulé ca dans un usercontrol donc on pose des datagrid maison à la place des datagrid de microsoft
    notre datagrid on lui donne une requete et il se débrouille
    et on a aussi ajouté des boutons en haut du usercontrol, ajout, suppression, impression etc... le tout en automatique, notre datagrid génère une fenetre qui demande la saisie des champs et génère la requete d'insert
    on peut modifier les valeurs et ca génère la requete d'update
    (le datareader fournit des tas d'infos comme si le champ est de type clé primaire, si les null sont autorisés ...)

    selon ce qu'on veut faire ca peut etre un peu long à écrire donc faut voir selon vos besoins
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Merci sperot pour la recette

    Juste je n'ai toujours pas compris c'est quoi un thread en VB.Net, ca se mange?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    windows permet de faire tourner plusieurs applis en meme temps, il passe de l'une à l'autre ce sont des processus, à l'interieur d'un processus on peut reproduire le meme fonctionnement
    un processus peut héberger plusieurs threads

    dans visual studio quand tu fais du pas à pas, y a une ligne jaune qui passe d'une ligne à une autre

    avec plusieurs threads c'est comme s'il y avait plusieurs lignes jaunes qui passent d'une ligne à l'autre à des endroits différents (ou le meme) du programme

    un processus au minimum un thread, celui de démarrage qu'on appelle le thread principal

    le processeur (et le reste de la machine) sont donc exploités au mieux

    de plus, un traitement long bloque le thread principal
    le thread principal est le seul à pouvoir modifier une propriété sur un control, pour passer d'un thread au thread principal il faut utiliser des délégués (j'ai deja expliqué en détail ce fonctionnement sur le forum)
    pour tester ca, un while true suivi de end while, on voit que pendant la boucle, l'appli fige et y a marqué "ne répond pas"

    NB :
    - un thread se démarre sur une sub dont on donne le nom, à la fin de la sub le thread se termine
    - il n'est pas nécessaire de garder une référence (variable pour les débutants) vers un thread, mais ca peut etre utile quand meme
    - une instance de thread ne peut etre démarrée qu'une fois, il faut en réinstancier un pour reexcuter le meme
    - un thread peut attendre sans rien faire via thread.sleep
    - on peut mettre en pause un thread ou lui dire de reprendre
    - si on met isbackground à true, le thread s'interrompt quand le thread qui l'a instancié se termine (pratique pour éviter qu'on ai l'impression que l'appli se ferme alors qu'elle est encore présente dans le gestionnaire des taches de windows)
    - on peut aussi l'interrompre de plusieurs manière
    - - abort : pas trop conseillé, peut se produire dans une classe du framework ...
    - - interrupt : quand rien d'autre ne marche ca peut se faire
    - - ou tout simplement flager un booléen que le thread surveille pour faire une sortie propre
    - les threads permettent donc de déporter des traitements pour faire plus de choses à la fois ou tout simplement pour ne pas figer l'interface, on peut aussi s'en servir pour charger à l'avance des données avant que l'utilisateur ouvre des fenetres

    : attention tout de meme, une application multithreadée comporte des risques de bug plus gros et nécessite une programmation rigoureuse qui ne peut etre mise en place qu'après une assimilation du principe et de ses risques, ca peut prendre un peu de temps
    en effet, les variables peuvent etre manipulés par plusieurs threads en meme temps, et certaines n'aiment pas
    par exemple, sur une collection, si un thread fait .Add pendant que l'autre faisait un for each, ca plante
    donc des try catch un peu partout ca fait pas de mal (au moins toutes les sub déclenchée par des evenements, j'irais meme jusqu'à dire toutes les sub publiques dans un environnement multi développeur)
    il y a néanmoins des outils ou pratiques pour éviter les problèmes, par exemple faire des copies des données avant de les lires (avec linq to object on copie une collection rapidement et on peut travailler sur la copie pour un for each)
    il y a aussi les verrous tels synclock et les readerwriterlock (et le nouveau en slim, comme les jeans)
    (ne pas utiliser les monitor qui peuvent amener plus d'erreur d'étourderie, synclock)




    pour en revenir à mon datagrid, on charge les données pendant que l'appli reste utilisable, toutes les x lignes on repasse sur le thread principal pour mettre le nouveau nombre de lignes (200 lignes la première fois)
    donc au bout de 200 lignes chargés (à vu de nez moins de 300ms), l'utilisateur commence à l'utiliser, et après toutes les secondes (environ) on lui en rajoute 1000 ou 2000, donc on va plus vite que lui ^^
    à vu de nez aussi, je dirais qu'on met environ 5 secondes pour 10k lignes * 8 colonnes, enfin t'facon une fois que les données apparaissent, l'utilisateur commence à réfléchir à ce qu'il voulait chercher et commence à parcourir ..., et lire 10k lignes ca prend du temps lol



    EDIT : wow ! pavé inside !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    J'essai de remplir la datagridview avec un list of

    comment intéger le contenue du list of dans le datagrid ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    .rows.Add() possède une surcharge qui demande les valeurs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    voici mon code et dit moi si il y a quelquechose qui ne va pas car ça fonctionne pas


    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
     
    Dim tableau As New List(Of Object)
            Dim nbl, nbc As Integer
            bdd.ouvre_base() 'ouvre la base
            nbl = bdd.get_NbEnregistrement 'Récupre le nombre de ligne
            bdd.Execute_sql() 'Execute une requete
            nbc = bdd.get_Nombre_champs 'Récupère le nb de champ
          ' ----> Insere les champs dans le datagridview
            For t As Integer = 0 To nbc - 1 
                control.Columns.Add(bdd.get_Nom_Champ(t), bdd.get_Nom_Champ(t))
            Next
            '<-----
            '-----> Rempli le tableau
            While (bdd.lit_resultat())
                For t = 0 To nbc - 1
                    tableau.Add(bdd.getResultatObjet(bdd.get_Nom_Champ(t)))
                Next
                l = l + 1
            End While
          ' <---------
            bdd.fermer_base() 'Ferme la base
     
            control.Rows.Add(tableau) 'Ajoute le tableau dans le datagrid

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    J'ai trouvé

    il faut mettre tableau.ToArray() pour qu'il converti le list of en tableau pour le datagridview
    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
     
    Public Sub Rempli(ByVal control As DataGridView, ByVal table As String)
     
            Dim tableau As New List(Of Object)
            Dim nbl, nbc As Integer
            bdd.ouvre_base()
            nbl = bdd.get_NbEnregistrement
            bdd.Execute_sql()
            nbc = bdd.get_Nombre_champs
            For t As Integer = 0 To nbc - 1
                control.Columns.Add(bdd.get_Nom_Champ(t), bdd.get_Nom_Champ(t))
            Next
            Dim l = 0
            While (bdd.lit_resultat())
                For t = 0 To nbc - 1
                    tableau.Add(bdd.getResultatObjet(bdd.get_Nom_Champ(t)))
                Next
                l = l + 1
            End While
            bdd.fermer_base()
            'Dim valeur() As Object
            'ReDim valeur(nbc)
            '
            control.Rows.Add(tableau.ToArray())
     
        End Sub

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Zend Server trop long à charger
    Par geeka dans le forum Zend Framework
    Réponses: 0
    Dernier message: 26/03/2015, 14h17
  2. [Débutant] DataGridView Long à charger.
    Par mrbrams dans le forum C#
    Réponses: 20
    Dernier message: 30/10/2014, 11h55
  3. PC sous Vista trop long à charger
    Par donny dans le forum Windows Vista
    Réponses: 5
    Dernier message: 16/09/2009, 14h14
  4. Site trop long à charger
    Par myspirou dans le forum IIS
    Réponses: 0
    Dernier message: 05/08/2008, 14h49
  5. DBLookupComboBox long à charger
    Par alex2003 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2008, 11h56

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