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 :

Problème Scrollbard Datagrid


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut Problème Scrollbard Datagrid
    Bonjour,

    J'ai un gros soucis avec l'affichage des données dans mon DataGrid, je m'explique :

    Ayant une table avec env. 15 000 enregistrements j'essaie donc de faire une pagination en utilisation une requête qui me permet d'afficher les tant d'enregistrement à chaque fois.
    Mon problème c'est que lorsque je clique sur la scrollbard de mon DataGrid il va bien m'afficher les données suivantes mais devient inaccessible par la suite comme-ci j'avais un problème ce dont je ne vois pas pourquoi puisqu'au démarrage avec la première alimentation tout est ok. J'ai donc mis un DoEvents en pensant que ça allez arrangé mes à faire mais non.
    De plus pour combler le tout si j'ai le malheur de double-cliquer 2 fois dessus (sur le scrollbard) mon DataGrid recouvre tout mon formulaire donc ce qui recouvre mes autres champs.

    Résultat c'est le Bor..l !!!

    Merci d'avance pour vos réponses.

    Johann36

  2. #2
    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
    pas trop compris
    tu mets les 15k enregistrements dans le datagrid ? ou alors comment fait tu pour changer de requete si tu mets pas tout
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    En faite j'ai une table contient pas mal de données (15K env.) donc pour éviter d'avoir 30mn d'attente pour l'affichage de mes données dans le datagrid, je souhaite donc faire une pagination (c'est ce que l'on m'a conseillé) pour afficher per ex 100 enreg à chaque fois.

    Pour cela j'utilise la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select first 100 skip 0 * from table
    cela me permet d'afficher une plage de 100 enregistrements à chaque fois.

    Le problème vient donc de mon datagrid, j'ai le scrollbard qui lors du clique pour afficher les enregistrements suivant devient inactif comme si j'avais une application qui me prenait énormément de ressource alors que mes données elles ce sont bien affiché.

    Je voulais savoir de quoi provenait mon problème et quel remède appliquer pour que tout revienne à la normale.

    Jb_One73

  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
    je connais pas cette technique
    et le datagrid est censé demander la suite quand l'ascenseur descend, c'est ca le principe ?

    sinon pour mettre 15k lignes dans un datagrid (ou plus) c'est possible sans ralentir l'appli
    le datagridview a une option virtualmode, en la mettant à true, on peut gérer soit meme les données
    car le framework en passant par des trucs tout fait instancie des classes énormes pour chaque ligne, alors qu'en stockant les valeurs dans un tableau d'objet c'est 100x plus rapide
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Merci sperot51 pour tes réponses.

    Bon maintenant une nouvelle piste pour moi à exploiter cependant j'ai essayé d'utiliser la fonction virtualmode est honnêtement c'est pas simple.

    Il faut substituer à cet événement d'autres événements tel que "CellValueNeeded" et la je n'y comprend rien.

    Si tu as des exemples ou autres je suis preneur.

    La seul info que j'ai trouvé pour le moment c'est ici http://msdn.microsoft.com/fr-fr/libr...kc(VS.80).aspx

    Merci d'avance.

    Jb_One73

  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
    si tu veux partir sur un datagrid comme ca, je te conseille de faire un usercontrol pour déporter le code dedans (plutot que de l'avoir dans une fenetre mélangé avec le reste)

    je vais t'expliquer dans les grandes lignes ce qu'on a fait, qui nous permet d'avoir des datagrid qui affiche 100k lignes
    c'est pas à la portée d'un débutant, mais c'est pas énorme non plus


    infos de départ :
    un thread permet de faire des traitement sans figer l'interface utilisateur
    me.invoke permet d'executer une sub via un délégué en revenant temporairement sur le thread principal
    le but est de stocker les valeur dans une variable type tableau à 2 dimensions (nous avons choisi un System.Collections.Generic.List(Of Object())
    le list permet d'attendre le y voulu et le tableau d'objet dedans permet d'accéder au x
    (ex : valeurs(3)(5) contient la valeur as object)


    en virtualmode, il faut gérer l'évènement cellvalueneeded
    cet évènement est déclenché pour chaque cellule qui devient visible (donc énormément de fois quand on déplace l'ascenseur)
    mais de panique ca ne se voit pas et ca ralenti pas
    il faut aussi creer les lignes et les colonnes soit meme

    dans cet evenement, e contient les coordonnées de la cellule qui demande sa valeur, et il suffit de mettre la valeur dans e.value


    le stockage des valeurs doit donc etre fait à la main et il faut pouvoir retrouver la valeur grace aux 2 coordonnées

    sur le usercontrol, on met une sub qui sert à remplir le datagrid, en passant la requete SQL par exemple

    avec un datareader on fait executereader, on a donc accès à la définition des colonnes, on créé donc les colonnes du datagridview

    on démarre un autre thread

    sur ce thread, on parcours les résultats du datareader (while .read)
    on ajoute les valeurs la variable qui contient les données

    toutes les 500 lignes ajoutées, on appelle une sub en repassant par le thread principal (me.invoke sur un délégué)
    cette sub crée les lignes physiquement (en virtualmode, il suffit de faire .rows.add en gros pour ajouter x lignes "vides" en une seule fois)
    le fait d'ajouter les lignes fait qu'elle se remplissent, ca appelle cellvalueneeded
    à la fin de la création des lignes, ca repart sur le thread déporté

    l'utilisateur peut deja utiliser le datagrid avec les 1000 premières lignes une fois que c'est revenu sur le thread asynchrone
    (me.invoke attend la fin de l'invoke pour passer à la ligne d'après, à la différence de me.begininvoke)

    et il suffit de gérer l'evenement cellvalueneeded pour mettre dans e.value la valeur trouvée dans le tableau à 2 dimensions



    à vu de nez, il faut moins de 300 lignes pour faire tout ca
    j'espère que j'ai rien oublié, sinon ca va etre moyennement compréhensible

    et désolé si c'est trop complexe, mais nous on avait besoin d'un datagrid qui affiche plusieurs milliers de lignes en une poignée de secondes ...
    et notre datagrid amélioré fait même beaucoup plus de choses (on a plus de 5k lignes de code)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Bonjour et merci sperot51 pour toutes ces informations.

    Ben il ne me reste plus qu'à m'atteler et prendre les raines, je vais essayé tout ça pour les 300 lignes de code ça devrait être OK mais quand je vois que tu en as fait plus de 5K lignes ... je reste sans voix.

    En tout cas un grand merci pour toutes ces informations. De plus cela va me permettre d'avancé un peu plus côté programmation VB.Net, je débute dans le métier apprendre tout seul c'est parfois pas très simple et encore une chance qu'il existe des forums comme developpez.com et des gens comme toi pour nous aider, j'espère que dans un avenir proche je pourrais faire comme toi aider les autres.

    Pour finir, si cela ne dérange pas je vais te garder sous le coude en cas de problèmes (attends toi (si tu es d'accord bien sur) à ce que cela soit fréquent sans allez dans l'excès).

    Voilà, je pense moi aussi avoir fait le tour et je te remercie une nouvelle fois pour tout.

    A très bientôt.

    Jb_One73

  8. #8
    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
    pas de soucis, je réponds meme au mp des fois

    moi je faisais du vb6 avant, pour passer à .net j'ai lu ca : http://plasserre.developpez.com/vsommair.htm
    j'y ai potassé une semaine et après il a fallut quelques mois pour assimiler tous les concepts
    et une fois qu'on connait pas mal de choses, .net est vraiment une plateforme pratique, enfin la POO surtout, l'héritage et autre ca permet plein de choses


    notre datagrid qui fait plus 5k lignes, on y a passé du temps
    mon chef a des idées étonnantes d'efficacité
    en fait notre datagrid comporte plein de boutons en haut
    on lui donne une requete, il rempli le datagrid, il est designable meme à l'execution, on peut cacher ou non des colonnes (la conf est enregistrée en base)
    et le bouton "ajouter" une ligne est un des plus fort, il ouvre une fenetre d'ajout générique avec la liste des champs, et un textbox a coté pour mettre la valeur
    donc rien à coder nulle part dans l'appli c'est automatique
    le bouton imprimer c'est pas moi qui l'ai fait mais à priori ils ont réussi en quelques lignes à faire un code générique aussi qui utilise une objet d'impression de .net qui sait faire export excel et pdf
    et plein d'autres fonctionnalités ...

    on fait plein de softs qui se ressembles mais qui sont adaptés au client
    donc le but c'est de développer vite et bien, donc avec des controles qui font une grande partie du boulot tout seul
    résultat on arrive à faire des fenetres avec 4 datagrid qui sont liés entre eux, avec des boutons qui changent les requetes etc.. le tout avec 5 ou 6 lignes de codes pour la fenetre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Problème avec DataGrid
    Par walid kh dans le forum VB.NET
    Réponses: 5
    Dernier message: 23/03/2010, 16h10
  2. [VB express 2008] Problème avec datagrid
    Par libremax dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/10/2009, 11h36
  3. [Struts-Layout] Problème avec Datagrid
    Par Le Pharaon dans le forum Struts 1
    Réponses: 15
    Dernier message: 25/07/2007, 14h13
  4. [VB 6.0] - problème avec Datagrid pour l'affichage de valeurs
    Par jimbololo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/04/2007, 09h57
  5. Problème Pagination Datagrid
    Par ibtools dans le forum ASP.NET
    Réponses: 13
    Dernier message: 06/02/2007, 13h41

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