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 :

Optimisation remplissage DataGridView


Sujet :

VB.NET

  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Optimisation remplissage DataGridView
    J'ai besoin de remplir un DataGridView à partir d'un Dictionary "MesVar" qui contient environs 36000 données (MesVar est interne à mon appli, pas une base de donnée externe). Ces 36000 données sont réparties dans des tableaux de différentes tailles référencés par une clef alphabétique (le dictionary).

    J'utilise le code suivant qui fonctionne trés bien mais est "un peu longuet".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Toutes les varaibles sont affichées
    Me.DataGridViewVariables.Rows.Clear()
    ForEach kvp As KeyValuePair(OfString, EditeurSMCType.DonneesVariable()) In MesVar
    MaData = MesVar(kvp.Key)
    For i = 0 To MaData.Length - 1
     Me.DataGridViewVariables.Rows.Add(kvp.Key, i, MaData(i).Utilisee,kvp.Key & i, _
     MaData(i).Mnemo, MaData(i).Libelle, MaData(i).Valeur)
    Next i
    Next kvp
    Est-il possible d'optimiser ce code (du genre traitement par tableaux complets sans parcourir tous les éléments de chacuns des tableaux)?



    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par sibama Voir le message
    Est-il possible d'optimiser ce code (du genre traitement par tableaux complets sans parcourir tous les éléments de chacuns des tableaux)?
    non, tu es obligé de parcourir les tableaux, parce que le DataGridView ne saura pas comment les traiter...

    Ce que tu pourrais faire, qui serait peut-être un peu plus efficace, c'est "aplatir" tes données (les mettre sous forme d'une liste d'éléments, et non dans des tableaux contenus eux-mêmes dans un Dictionary), et définir la liste obtenue comme DataSource du DataGridView.

    Mais de toutes façons, avec 36000 éléments à afficher ce sera forcément un peu lent... à moins d'utiliser le mode virtuel, qui sert justement à ça. Tu fournis les données à la demande en gérant l'évènement CellValueNeeded.
    http://msdn.microsoft.com/en-us/libr...rtualmode.aspx

  3. #3
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Dans ta deuxième boucle for, tu pourrais pas utiliser le:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With MaData(i)
    [...]
    End With
    ??

    Il me semble avoir déjà vu à quelque part que ça optimisait la vitesse d'exécution, mais je peux me tromper aussi. Je crois d'ailleurs avoir vu ça sur le site de P.Lasserre (voir ma signature)...

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    je pense pas que with change grand chose niveau perf (m'enfin si c'est monsieur lasserre qui le dit, il a du tester)


    sinon avec le mode virtuel, en effet tu remplira ton datagrid de 36000 lignes en moins de 2 secondes ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Merci pour vos réponses.

    Je dois avouer qu'après avoir esayé un peu le mode virtuel, j'ai regardé comment optimiser mes variables, car en fait, pour ne pas déclarer de Hashtable, je suis obligé de créer un nombre important d'adresses de variables qui non pas d'existence réelle dans mon cas.

    J'ai donc "simplement" ajouté un flag "existe" à la structure qui me sert à définir chacune de mes variables. Je mets ce flag à jour lors de la définition de ma base de variables et j'ai transformé mon code comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Me.DataGridViewVariables.Rows.Clear()
    ForEach kvp As KeyValuePair(OfString, EditeurSMCType.DonneesVariable()) In MesVar
    MaData = MesVar(kvp.Key)
    For i = 0 To MaData.Length - 1
    If MaData(i).Existe Then
    Me.DataGridViewVariables.Rows.Add(kvp.Key, i, MaData(i).Utilisee, kvp.Key & i, _
    MaData(i).Mnemo, MaData(i).Libelle, MaData(i).Valeur)
    EndIf
    Next i
    Next kvp
    Je pense qu'il met beaucoup moins de temps pour exécuter le If supplémentaire que pour traiter le Rows.Add car la mise à jour du DataGridView en est presque "rapide".


    2 petites questions cependant:
    • A Faladin: comment voyais-tu l'utilisation du With, car vu que MaData est imbriquée avec des données non liées à MaData (kvp.key et i), et qu'il faut (sauf erreur de ma part) les "," pour séparer les champs, je vois pas. Par contre je suis d'accord avec toi sur le fait que j'ai bien lu quelque part qu'il était plus rapide de faire un With/End With que de répéter plusieures fois tout le début de la séquence. J'essaye donc de le faire systématiquement
    • A Tomlev: En supposant que j'aplatisse mes données et que je les passe en Datasource, est-il possible de faire des tris sur l'affichage du DataGridView pour n'afficher qu'une partie des données? Et de plus, si je duplique mes données (car dans le reste de mon appli, je souhaite garder cette notion de Dictionary qui marche du feu de Dieu pour ce que je cherche à en faire) est-ce que ça fait pas un peu "lourd" comme utilisation mémoire?

    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par sibama Voir le message
    Je pense qu'il met beaucoup moins de temps pour exécuter le If supplémentaire que pour traiter le Rows.Add car la mise à jour du DataGridView en est presque "rapide".


    • A Tomlev: En supposant que j'aplatisse mes données et que je les passe en Datasource, est-il possible de faire des tris sur l'affichage du DataGridView pour n'afficher qu'une partie des données? Et de plus, si je duplique mes données (car dans le reste de mon appli, je souhaite garder cette notion de Dictionary qui marche du feu de Dieu pour ce que je cherche à en faire) est-ce que ça fait pas un peu "lourd" comme utilisation mémoire?
    Tu peux utiliser une BindingSource, ce qui permet de filtrer et/ou trier les données.
    Pour ce qui est de l'utilisation mémoire, ça dépend un peu de la taille des éléments de données...

    Sinon, je persiste à penser que la meilleure solution est le mode virtuel, mais dans ton cas précis c'est un peu compliqué, car vu la structure des données ce n'est pas évident de savoir quel élément correspond à un index particulier... enfin, ce n'est pas le bout du monde, mais ça t'oblige à faire des calculs par rapport à la longueur des tableaux contenus dans le DIctionary

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    avec le mode virtuel tu fais
    Me.DataGridViewVariables.Rows.Add(madata.count)

    et hop ton tableau est affiché et utilisable, y a pas plus rapide en chargement (bon un peu de code à mettre dans un evenement qui demande "dans telle case je mets quoi ?" mais ca remplit que les cases visibles donc c'est rapide)

    de plus en passant par une variable de plus, tu peux faire des tris et des filtres en moins de 2 secondes aussi
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre expérimenté Avatar de Faladin
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 333
    Par défaut
    Effectivement, y'A toujours moyen d'enregistrer ce qui n'a pas rapport au "With" dans d'autre variable, surtout que ton "kvp.Key" tu l'utilises trois fois, et ton "With" the ferais sauver 5 fois l'utilisation de "Madata(i)".

    Mais bon, moi je suggérais, ça vaut le coup d'essayer, mais je sais pas si tu vas voir une différence.

    J'ai une autre idée aussi, t'a essayé de rendre ton datagridview invisible pendant la boucle? J'avais déjà fait ce truc pour remplir des TreeView un peu lourd et ça avait grandement amélioré la rapidité, car il n'avait pas a "repeindre" le TreeView à chaque ajout de noeud. Je sais pas si un DGV fonctionne de la même façon par contre...

  9. #9
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Bon OK, je me lance dans le mode virtuel, mais quelques questions/remarques avant le grand saut:

    Tout d'abord, dans mon appli, la sturcture des variables est figée, il n'est pas possible d'en créer d'autres, ni d'en supprimer, ce qui fait que je devrais réussir (avec l'aide d'une calculatrice scientifique pour être sur) a faire les additions pour déterminer le nombre d'éléments où .Existe = true (ça reste dans mes cordes).

    Donc si je me réfère à l'exemple de MSDN cité par Tomlev dans la première réponse, je ne devrais pas avoir à gérer la création d'un nouvel élément. Par contre dans cet exemple il me semble qu'ils interdisent le suppression, c'est juste dû à l'exemple ou c'est une caractéristique du mode virtuel?

    Est-il préférable pour éviter un filtre supplémentaire systématique sur le .Existe que je crée un tableau d'éléments qui contiendrait les données déjà formatées? On est d'accord sur le fait que dans mon cas ce sera un tableau à 2 dimensions avec autants d'enregistrements que de variables .Existe dans une dimension et les données relatives à chaque variable dans l'autre dimension. Et que si je met ce tableau comme datasource, c'est le datagridview qui s'arrange pour savoir que les premières doonnées de variable vont dans la 1ere colonne, les 2eme dans la seconde, etc...?


    Actuellement, j'ai 2 combobox qui me permettent:
    • pour un de me positionner sur la 1ere variable de chaque "type" de mon dictionary, d'où l'utilité du kvp.key (qui est une colonne invisible) mais qui me permet de rechecher par une boucle itérative le premier kvp.key qui correspond à mon combobox. Le fait d'être en mode virtuel va-t-il changer cela?
    • pour le deuxième il me permet d'afficher toutes les variables, ou seulement celle qui sont utilisées ou celles qui sont libres (via un test sur madata(i).utilisee. Il va donc falloir que j'utilise cette donnée dans le bindingsource?
    Une dernière "petite" question: pour définir le datasource, je suppose qu'il va falloir que je le fasse par une ligne de code. Ce n'est pas un soucis je pense, c'est plutot que je vois pas pourquoi, quand j'utilise l'explorateur qui apparait quand je clique dans la propriété de Datasource, je vois dans Autres sources de données: un de mes formulaires et la classe où sont définies mes structures. Mais je ne vois pas toutes mes classes ou tous mes formulaires, ni mes variables plus "fines" telles que MesVar qui est déclarée dans un module?


    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Si tu utilises le mode virtuel, tu ne peux pas utiliser de DataSource il me semble...

  11. #11
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Il se passe quelque chose de Strang qund je fais le Addcopies, un joli message d'erreur me signale que mon index est hors limite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataGridViewVariables.Rows.AddCopies(0, 20232)
    J'ai essayé de changer le 20232 en 10, le message persiste.
    Il faut préciser que lorsque je lance le code, je n'ai pas repris tous le code donné dans MSDN, car je me permet de penser que toutes ces lignes ne sont pas nécessaires étant donné mon appli où rien n'est à créer ni supprimer.
    Ou alors ais-je mal compris et toutes les sub avec les tests sont obligatoires même si on ne crée pas de varibles, qu'on n'en supprime pas et qu'on n'en édite pas?


    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    j'ai pas compris grand chose à ton message...

    mais a priori l'erreur se produit parce que ta DataGridView n'a aucune ligne : AddCopies(0, 20232) copie 20232 fois la première ligne (index 0), mais si cette ligne n'existe pas ça plante...

  13. #13
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Merci de m'avoir répondu.

    Après quelques essais, et un peu de réflexion, j'en étais arrivé à la même conclusion, le problème ne vient pas du nombre de "addcopies" mais bien du fait que dans mon cas, il n'y a encore aucune ligne dans mon datagridview.

    Bon je fais un point sur mes cogitations:
    Dans l'exemple de MSDN, le Datagridview est créé via le New:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           Controls.Add(dataGridView1)
            dataGridView1.VirtualMode = True
            dataGridView1.AllowUserToDeleteRows = False
            dataGridView1.Columns.Add("Numbers", "Positive Numbers")
            dataGridView1.Rows.AddCopies(0, initialSize)
    et là, ils utilisent l'instruction Addcopies sans avoir créé de ligne avant.
    Dans mon cas je voudrais partir de mon Datagridview déjà existant, ayant déjà fait toute ma petite sauce de présentation dessus. Quand je veux me faire plus malin que VB en me disant que puisqu'il n'existe pas de ligne 0, je vais lui en créer une avant de la dupliquer via le Addcopies. Je fais donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.DataGridViewVariables.Rows.Add(toto)
    toto étant déclaré pour fournir des données à mes 5 colonnes.
    La, il faut reconnaitre que VB est trés fort puisqu'il me répond qu'on ne peut pas utiliser le Add en Virtualmode.

    Bon ne renonçant devans rien et décidé à comprendre, je duplique donc l'exemple de MSDN dans un nouveau projet et j'essaye de regarder comment ça marche.

    Je peux donc passer sur le fait qu'il faudra en passer par un New DataGridView et que je passerai par code tous les parmètres de présentation, c'est pas si complexe que ça après tout. Ceoendant, la où j'ai un doute, c'est sur ce que je vais pouvoir faire dans ce DataGridView.

    Je m'explique: Dans mon appli, les données présentes dans le DataGridView sont "prédéfinies", pas de création ni de suppression à envisager, au plus, plus tard, la possibilité de modifier les champs "Mnémo", "Libellé" et "Valeur", mais les adresses resteront vérouillées.
    Ce que je veux sur ce formulaire, c'est naviguer dans les données, faires des recherches sur des parties de chaines de caractères, filtrer l'affichage et pouvoir me positionner sur un "Rows" de mon choix.

    Dans l'exemple de MSDN, j'ai eu l'impression que l'on doit fournir certaines méthodes (en les programmant) au DataGridView. Ce qui me fait penser cela c'est que pour l'ajout d'une nouvelle ligne, ils programment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub dataGridView1_RowsAdded(ByVal sender As Object, _
    Faut-il en faire autant pour afficher une ligne spécifique en plein millieu des données?
    Pour la recherche, je suppose qu'il faut travailler sur ce qui alimente le DataGridView, et qu'ensuite on lui demande d'afficher la ligne qui va bien?
    Si c'est bien le cas, je comprend ta remarque sur le fait "d'aplatir" mes données (ça j'y arrive, mais temps que je ne suis pas en Virtualmode, je ne vois pas de gain significatif et ça me fait créer une table intermédiaire qui ne me sert pas à grand chose pour l'instant).

    Voila où j'en suis, mon DataGridView existe "lentement", les fonctions d'affichage et de recherche affichent et recherchent "lentement".
    Le Virtualmode marche super bien dans l'exemple de MSDN mais je sèche un peu pour l'adapter.

    Petite remarque: Quand j'essaye de bricoler l'exemple de MSDN pour lui ajouter des instructions sauce perso, la saisie "semi automatique" (apparition des possibilité après frappe de 1eres lettres) ne fonctionne pas. Je suppose que c'est dù au fait que le DataGridView1 étant créé par le New, il n'existe pas au moment de la frappe du code et que VB ne sait pas à quoi les premères lettres font référence?
    Si c'est ça, ca complique un peu la saisie du code.



    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  14. #14
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    pour ajouter des lignes il faut faire .Add et pas .AddCopies


    j'ai expliqué le fonctionnement d'un datagrid en virtualmode avec une lecture en base de données ici :
    http://www.developpez.net/forums/d59...d/#post3552028

    mais vu que ce qu'il y a dans la base, je le mets dans une variable y a une partie du principe qui marche pour toi et tu n'as pas ce temps à perdre, c'est pour ca que réellement, je pense qu'en 2 ou 3 secondes ton datagrid doit etre rempli
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Salut Sperot51 et Tomlev, j'ai essayé le code suivant:
    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
    PublicClass Virtualmode
    Dim store(19, 1) AsInteger
    Dim numberOfRows AsInteger = 20
    DimWithEvents dataGridView1 AsNew DataGridView
    PrivateSub Virtualmode_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
    For i = 0 To 19
    For j = 0 To 1
    store(i, j) = i + j
    Next j
    Next i
    Controls.Add(dataGridView1)
    Me.dataGridView1.VirtualMode = True
    Me.dataGridView1.AllowUserToDeleteRows = False
    Me.dataGridView1.Columns.Add("Colonne1", "Titre1")
    Me.dataGridView1.Columns.Add("Colonne2", "Titre2")
    Me.dataGridView1.Rows.AddCopies(0, numberOfRows - 1)
    Me.dataGridView1.AllowUserToAddRows = False
    Me.dataGridView1.ReadOnly = True
    EndSub
    PrivateSub dataGridView1_CellValueNeeded(ByVal sender AsObject, _
    ByVal e As DataGridViewCellValueEventArgs)
    e.Value = store(e.RowIndex, e.ColumnIndex)
    EndSub
    EndClass
    
    Le DataGridView s'affiche bien avec 2 colonnes, pas de message d'erreur, mais des cellules désespérément vides.
    Quand je mets un point d'arrêt sur "e.Value = store(e.RowIndex, e.ColumnIndex)", le code ne s'arrête pas dessus.
    J'ai du louper une petite marche quelque part?


    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    il faudrait peut-être ajouter la méthode dataGridView1_CellValueNeeded comme handler de l'évènement CellValueNeeded

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler dataGridView1.CellValueNeeded, AddressOf dataGridView1_CellValueNeeded
    ou encore en utilisant la syntaxe déclarative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub dataGridView1_CellValueNeeded(ByVal sender AsObject, _
            ByVal e As DataGridViewCellValueEventArgs) Handles dataGridView1.CellValueNeeded
            e.Value = store(e.RowIndex, e.ColumnIndex)
    End Sub
    D'ailleurs, pourquoi tu ne passes pas par le designer pour configurer le DGV ?

  17. #17
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Après intense réflexion: DGV = DataGridView (c'est vrai que dit comme ça, ça va plus vite), n'empèche que sur le coup, je me suis dit qu'est ce que ce que ce de trigramme.

    OK, je crois comprendre cette histoire de Handler, j'essaye ce soir.

    Pour répondre à ta question sur le designer, si j'ai bien compris, c'est pourquoi je ne passe pas par l'interface graphique de mon FORM?

    En fait c'est bien là mon problème (relativement parlant), pour que mon bout de code fonctionne (et surtout l'instruction "addcopies"), il ne faut pas que le DGV soit déjà présent sur le FORM. Du coup je suis obligé de passer par du code...


    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  18. #18
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Et dites donc, ça marche du feu de D... votre truc, merci de m'avoir encouragé à percévérer.

    Tomlev, je dois te paraitre un peu neuneu, mais tu as raison, pourquoi se casser la tête alors qu'on peu "simplement" passer par le designer, il suffit de créer sont DGV (vachement plus court à saisir comme ça si je rajoute pas un commentaire à chaque fois que j'utilise le trigramme), et pour résoudre mon problème de "addcopies", il suffit d'ajouter une ligne Add avant de passer le DGV en virtualmode. Le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim init1() AsString = {"", ""}
    Me.DataGridView1.Rows.Add(init1)
    Me.DataGridView1.VirtualMode = True
    Me.DataGridView1.Rows.AddCopies(0, numberOfRows - 1)
    marche super bien, les autres paramètres étant gérés sous le designer.

    Le handler de ton exemple semble assez logique après coup, c'est pas le nom de la Sub qui est important (rigolez pas je croyais que c'était ça), c'est bien ce paramètre qui lie la sub à l'événement...

    Merci à toi et à Sperot51, j'attaque maintenant l'adaptation de ce code à mon DGV de données.



    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  19. #19
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    Citation Envoyé par sibama Voir le message
    c'est pas le nom de la Sub qui est important (rigolez pas je croyais que c'était ça), c'est bien ce paramètre qui lie la sub à l'événement...
    au fur et à mesure on se rend compte que la plateforme .net, et visual studio sont beaucoup plus carrés qu'on ne le pense
    ce qui permet de développer sereinement, grâce à la fiabilité de l'outil
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplissage DatagridView avec Base Oracle
    Par Sharp93 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 23/06/2009, 10h00
  2. Réponses: 1
    Dernier message: 22/06/2009, 22h55
  3. Réponses: 17
    Dernier message: 01/04/2009, 12h58
  4. Problème remplissage datagridview
    Par callo dans le forum C#
    Réponses: 7
    Dernier message: 12/02/2008, 15h27
  5. [windev10]optimisation remplissage d'une table
    Par nath-0-0 dans le forum WinDev
    Réponses: 6
    Dernier message: 16/03/2007, 14h34

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