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

Windows Forms Discussion :

[Vb.net][treeview]Exemple de treeview


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut [résolu][Vb.net][treeview]Exemple de treeview
    Bonjour,

    je cherche un exemple complet de remplissage de treeview à partir de deux tables. J'ai une table client (avec 5 clients) et une table commande (liée par ComCliId = foreign key). Pour chaque client j'ai 6 commandes dans ma table commande.

    J'aurais dans mon treeView mon root node intitulé "Tous" auquel seraient racrochés mes 5 noeuds clients et sur chaque noeud client, j'aurais mes 6 commandes de ce client.

    J'ai trouvé un super exemple "TreeView Class" dans ".NET Framework Class Library" mais je bloque car ils "supposent" :
    This example assumes you have a Customer object that can hold a collection of Order objects
    et c'est là que ça coince car que veut dire "avoir un objet CLIENT qui peut gérer une collection d'objets COMMANDE" ?

    Les exemples de TreeNode sont basés sur le même exemple et donc posent le même problème.

    Quelqu'un a une idée ?

  2. #2
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Salut,
    Une solution rapide qui marche mais que tu devras adapter selon tes besoins:

    Tu crées une classe Client avec en Private ClientId et ClientName

    Tu crées une classe Commande avec en Private CommandeId, ClientId, CommandName.

    Tu récuperes tes enregistrements dans ta table Client et pour chaque enregistrement tu crée un objet de type Client. Tu crées un array de nodes à partir de tes clients:

    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
    Function GetClients() As TreeNode()
            Dim c As New Client
            dim dtClient as datatable
     
            'récupere ici tous les clients dans dtClients
     
            Dim ClientNodes() As TreeNode = New TreeNode() {}
            ReDim ClientNodes(dtClients.Rows.Count - 1)
     
            Dim count As Integer = 0
            For Each row  As datarow in  dtClients.row
               ClientNodes(count) = New TreeNode(row("ClientName"))
               ClientNodes(count).Tag = New Client(row("ClientId"), row.Item("ClientName").ToString)
               count += 1
            Next
            Return ClientNodes
        End Function
    Tu boucles sur tous tes clients. Pour chaque client tu récupere les commandes dans la table Commande, tu crées un array de nodes pour les commandes de ce client

    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
     
    Public Function GetCommandes(ByVal c As Client) As TreeNode()
            Dim count As Integer = 0
            Dim dtCommandes as DataTable
     
            'ici tu récuperes toutes les commandes correspondant au client
            'passé en parametre à la fonction GetCommandes. Tu les stockes
            'dans le datatable Commandes
     
            count = 0
            Dim CommandeNodes() As TreeNode = New TreeNode() {}
            ReDim CommandesNodes(dtCommandes.Rows.Count - 1)
                For Each row As DataRow In dtCommandes.Rows
                    CommandeNodes(count) = New TreeNode((row.Item("CommandName").ToString, CInt(detailrow("CommandId"))))
                    CommandeNodes(count).Tag = New Commande(c.ClientId, row.Item("CommandName").ToString ,Convert.ToInt16(row.Item("CommandId")))
                    count += 1
                Next
            Return CommandNodes
        End Function
    Pour contruire le tree:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub BuildClientTree()
            myTree.Nodes(0).Nodes.Clear()
            myTree.Nodes(0).Nodes.AddRange(GetClients)
     End Sub
    Meme chose pour les commandes, tu boucles sur les nodes 'Clients' et tu ajoutes les child nodes en appelant GetCommands.

    Tu noteras que j'ai utilisé la propriété .Tag des nodes pour stocker l'objet Client ou Commande, très utile lorsque tu cliques sur un node pour savoir de quel type il s'agit.

    Bon courage.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Merci pour ce code,

    je l'ai fais fonctionné (pour la partie création de client uniquement) . Il faut signaler qu'il faut absolument créer un noeud de base dans le tree, sinon il génère une erreur.

    'Dim c As New Client générait également une erreur et je suppose que ce n'est pas utile (j'espère pas pour la partie commande).

    Si je te comprends bien, dans le tag on peut stocker un objet ??? !!! (je l'utilisais en VB6 pour stocker un string structuré avec les clés des noeuds précédents) mais j'imagine que stocker un objet offre plus de possibilités...

    Je teste la partie commande ce soir ou vendredi.

    Voici toujours le code (presque) complet
    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
    Public Class myTreeFrm
        Inherits System.Windows.Forms.Form
        Dim dtClient As New DataTable
        'Dim c As New Client
     
     
        Public Class Client
            Private ClientId As Integer
            Private ClientName As String
            Sub New(ByVal myId As Integer, ByVal myName As String)
                ClientId = myId
                ClientName = myName
            End Sub
        End Class
        Function GetClients() As TreeNode()
     
     
            Dim ClientNodes() As TreeNode = New TreeNode() {}
            ReDim ClientNodes(dtClient.Rows.Count - 1)
     
            Dim count As Integer = 0
            For Each drCli As DataRow In dtClient.Rows
                ClientNodes(count) = New TreeNode(drCli("CliName"))
                ClientNodes(count).Tag = New Client(drCli("CliId"), drCli.Item("CliName").ToString)
                count += 1
            Next
            Return ClientNodes
        End Function
     
        Public Sub BuildClientTree()
            myTree.Nodes(0).Nodes.Clear()
            myTree.Nodes(0).Nodes.AddRange(GetClients)
        End Sub
     
     
        Private Sub myTreeFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            'récupere ici tous les clients dans dtClients 
            Me.daCny.Fill(dtClient)
            Call BuildClientTree()
        End Sub
    End Class

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    re-bonsoir,



    graphicsxp a écrit
    Meme chose pour les commandes, tu boucles sur les nodes 'Clients' et tu ajoutes les child nodes en appelant GetCommands.
    j'ai implémenter le code de la classe commande et une fonction:

    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
    Public Function GetCommandes(ByVal c As Client) As TreeNode()
            Dim count As Integer = 0
     
            Dim dtCommande As New DataTable
            Me.OleDbCom.CommandText = "SELECT ComId, ComDescr, ComCnyId FROM(ComTbl) WHERE(ComCnyId =" & c.getCliId & ")"
            Me.daCom.Fill(dtCommande)
     
            count = 0
            Dim CommandeNodes() As TreeNode = New TreeNode() {}
            ReDim CommandeNodes(dtCommande.Rows.Count - 1)
            For Each drCom As DataRow In dtCommande.Rows
                CommandeNodes(count) = New TreeNode((drCom.Item("ComDescr").ToString))
                CommandeNodes(count).Tag = New Commande(drCom("ComId"), drCom.Item("Comdescr").ToString, Convert.ToInt32(drCom.Item("ComCnyId")))
                count += 1
            Next
            Return CommandeNodes
        End Function
    serait-ce abuser de te demander la ou les lignes pour "boucler" et implémenter la commande ?

    merci

  5. #5
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Salut,

    Il faut signaler qu'il faut absolument créer un noeud de base dans le tree, sinon il génère une erreur.
    Oui, c'est normal, il ne faut pas oublié d'ajouter le 'root' node.
    Je t'ai seulement donné une ébauche de code, a toi de le compléter, ce que tu as fais

    Si je te comprends bien, dans le tag on peut stocker un objet ??? !
    En effet, et cela peut s'avérer extremement pratique. Par exemple lors d'un clique sur un node, tu peux détecter son type et ouvrir un nouveau form en fonction de ca. Alternativement sur le click droit, tu peux afficher un context menu adapter au type d'objet stocké dans le tag.

    serait-ce abuser de te demander la ou les lignes pour "boucler" et implémenter la commande ?
    Oui, c'est abuser, car je suis en vacances
    Non je plaisante, ca me dérange pas. Je suppose que ce que tu veux c'est le code pour ajouter les nodes Commandes aux nodes Clients, n'est ce pas? Dans ce cas fais quelquechose du genre: (non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'Ici tu boucles sur les nodes 'Clients' appartenant au 'root' node.
    For Each n as TreeNode in myTree.Nodes(0).Nodes
     If TypeOf(n.Tag) is Client Then
      n.Nodes.AddRange(GetCommandes(directcast(n.Tag, Client)))
     End If
    Next
    En espérant t'avoir aider a avancer.

    @+

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Pour du code non testé, c'est pas mal !

    Copier, coller et ça fonctionne

    Un super merci pour ton support

    pour info, le code suivant fonctionne aussi puisque dans mon cas, je n'ai que des commandes au niveau 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public Sub BuildCommandeTree()
            For Each n As TreeNode In myTree.Nodes(0).Nodes
                'If TypeOf (n.Tag) Is Client Then
                'n.Nodes.AddRange(GetCommandes(DirectCast(n.Tag, Client)))
                n.Nodes.AddRange(GetCommandes(n.Tag))
                'End If
            Next
        End Sub
    Merci, bonnes vacances et joyeux Noël

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

Discussions similaires

  1. cherche exemple de treeview+struts dynamique
    Par debut_java dans le forum Struts 1
    Réponses: 7
    Dernier message: 03/09/2007, 17h20
  2. [ASP.net 2.0][c#] Treeview
    Par lenoil dans le forum ASP.NET
    Réponses: 6
    Dernier message: 31/08/2006, 11h44
  3. [VB.net] Selection dans un TreeView
    Par chatainsim dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/06/2006, 16h00
  4. [VB.NET] Construire dynamiquement des TreeView
    Par apoingsfermes dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/06/2006, 15h16
  5. [VB.Net] Pb avec les treeview, fan d'algo...
    Par bisounux dans le forum ASP.NET
    Réponses: 1
    Dernier message: 01/02/2006, 16h31

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