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 :

Remplir un treeview à partir d'une requête recursive


Sujet :

VB.NET

  1. #1
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut Remplir un treeview à partir d'une requête recursive
    Bonjour à vous,

    J'ai un joli problème qui m'empêche d'avancer et j'espère que vous pourrez m'aider. J'ai une table dans ma BD qui contient les relations entres mes bien matériels. Elle comprend l'id de la relation, le parent ainsi que l'enfant.

    PS : Pour ceux qui connaissent USD (fait par CA), c'est la table HIER.

    Elle permet de relier les pc, écran, câble réseau, switch, vlan etc entre eux.

    J'ai fait une requête récursive qui me retourne l'ensemble des enfants, d'un bien en particulier, sous cette forme :

    Parent Enfant
    Vlan1 switch1
    vlan1 switch2
    switch1 cable1
    Cable1 PC1
    PC1 Écran1
    PC1 Écran2
    switch1 cable2
    Cable2 PC2
    PC2 Écran
    Switch2 etc...


    Vous voyez le genre.

    Je suis maintenant rendu à afficher ce joli paquet de relations dans un arbre pour permettre de visualiser l'impact qu'aura la supression d'un bien matériel.

    Je n'ai aucune idée par où commencer. J'aimerais donc savoir si quelqu'un à une piste sur laquelle je pourrais me lancer!

    Merci beaucoup

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    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 193
    Par défaut
    par la requete il faut récupérer
    id, nom, idparent

    ensuite créer un dictionnaire (of id, node)
    et dans la boucle de lecture tu créé un node, tu l'ajoutes au dictionnaire, et tu recherches son parent dans le dictionnaire vu que tu as l'id parent pour faire dico(idparent).nodes.add(newnode)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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
    Sinon, les TreeView présents dans certaines suites de contrôles (celles de DevExpress par exemple) savent gérer ça nativement : tu indiques juste la DataSource, le champ ID, et le champ ParentID, et il se débrouille tout seul...

  4. #4
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Merci pour les réponse rapide. J'essaie ce matin et j'vous redonne des nouvelles!

  5. #5
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Bonjour,

    Voici comment j'ai fait, pour ceux qui rencontreraient le même problème.

    Avec ce code et une requête récursive, le programme affiche la hiérarchie pour 2500 éléments, sur 5 ou 6 niveau, en même pas 2 seconde.


    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
      'J'ai en paramètre la racine, et mon treeview en reférence
     
            Public Sub New(ByVal _root As String, ByVal _getParent As Boolean, ByRef _treeV As TreeView)
                'Mon araylist de node
                nodeArray = New ArrayList
                root = _root
                getParent = _getParent
                'Ma référence a mon treeview
                treeV = _treeV
                'Je crée ma collection de node 
                createNodecollection(root, getParent)
                'On vide le treeview
                treeV.Nodes.Clear()
                'On ajoute la racine
                treeV.Nodes.Add(New TreeNode(_root))
                tNode = New TreeNode
                tNode = treeV.Nodes(0)
                'On remplie de treeview en lui passant en référence tNode
                populateTreeView(_root, tNode)
                tNode.ExpandAll()
            End Sub
     
            Private Sub createNodecollection(ByVal _root As String, ByVal _getParent As Boolean)
                Dim dtHier As New DataTable
     
                'Les données servant à créer les nodes sont dans une datatable
                dtHier = getData(_root, _getParent)
                'Je remplie mon Array de Node avec l'id de l'item et son parent
                For Each row As DataRow In dtHier.Rows
                    nodeArray.Add(New node(row.Item(1), row.Item(0)))
                Next
            End Sub
     
            Private Sub populateTreeView(ByVal _parentId As String, ByRef _tNode As TreeNode)
                Dim parentNode As TreeNode
     
                For Each node As node In nodeArray
                    'Si le parent de mon node est pareil comme l'id du node parent
                    If node.parent = _parentId Then
                        'On crée un node avec l'id du node qu'on vien de trouver
                        parentNode = New TreeNode(node.ID)
                        'On ajoute le node dans la collection
                        _tNode.Nodes.Add(parentNode)
                        'Récursivité, on ré-apelle la fonction pour vérifier si le node qu'on vien d'ajouter à lui aussi un enfant.
                        'On crée une "Branche" si on veut
                        populateTreeView(node.ID, parentNode)
                    End If
                Next
            End Sub
    Donc merci pour les réponse!

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    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 193
    Par défaut
    à voir aussi, certains controles ont une méthode begininit ou beginupdate et le end qui va avec
    qui est à utiliser pour remplir entre les 2 avec plus de performances (ou sinon tenter le suspendlayout/resumelayout)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    J'avais remarqué ces méthodes, mais je n'en aurai pas besoin car le treeview que je remplie est instancié, remplie et affiché dans le code. Donc vb est censé s'occuper de l'affichage seulement lorsque je fait le .show() à la fin!

    Merci quand même pour les précisions

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    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 193
    Par défaut
    tente quand même, des fois qu'il y ait un indexage ou autre à chaque ajout, ou via beginload seulement une fois à la fin
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Après test, en utilisant le beginupdate et le endupdate, le traitement prend en moyenne 30-40 miliseconde de moins.

    Maintenant reste à voir si c'est la réalité ou si c'est la vitesse de réponse du serveur MSSQL qui variait.

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    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 193
    Par défaut
    il faut aussi compter le temps de compilation, à chaque lancement d'un exe, tout le code est compilé au fur et à mesure des appels des sub (la génération d'un exe ne compile que dans un langage intermédiaire qui est ensuite compilé en code natif à chaque fois donc)

    ca ajouté au fait qu'sql server fait de la mise en cache, il faut appeler 3 ou 4 fois la construction de ton form pour arriver à un temps stable et significatif pour effectuer une comparaison
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Merci pour les infos!

    J'ai laisser les beginupdate et endUpdate.

    Le traitement se fait entre 150 et 400 miliseconde.

    Je peux pas vraiment demander mieux.

    Merci pour le coup d'pouce

  12. #12
    Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Gabon

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Finance

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Par défaut
    Bonjour tous

    Je sais que cette discussion est résolue depuis 8 ans déjà mais j'ai exactement le même problème. J'ai essaye de reproduire la solution de SainteLaitLait mais il n'a pas précisé comment il déclare l'objet "node", or il l'utilise beaucoup dans le code.
    Peut-on avoir, 8 ans plus tard, le code relatif à la déclaration ou l'instanciation de cet objet please ?

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

Discussions similaires

  1. Remplir un combo à partir d'une requête
    Par lily59 dans le forum Général Java
    Réponses: 3
    Dernier message: 16/12/2011, 11h33
  2. remplir un champ à partir d'une requête
    Par jujurochedu42 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/02/2011, 10h11
  3. Réponses: 1
    Dernier message: 18/02/2011, 12h57
  4. Remplir un TreeView à partir d'une seule table
    Par naindjardin dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 07/05/2009, 00h25
  5. Réponses: 1
    Dernier message: 18/03/2009, 14h03

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