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 :

Remplir Treeview depuis DataTable


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 127
    Points : 61
    Points
    61
    Par défaut Remplir Treeview depuis DataTable
    Bonjour,

    J'essaye de construire un treeview depuis un table que je récupère depuis une base.
    Voici les tables et leur relation : image en pièce jointe (relations.jpg)

    Voici mon code que je teste sans succès depuis hier soir :
    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
     
            'Initialisation de la chaîne contenant l'instruction SQL
            Dim rqSql_Root As String = "SELECT * FROM Location ORDER BY Location_Name;"
            Dim rqSql_Nod1 As String = "SELECT Location_Name, Project_Name, Comentaire FROM Project " & _
                    "INNER JOIN (Location INNER JOIN EACB_flow ON Location.PK_Location = EACB_flow.FK_Location) " & _
                    "ON Project.PK_Project = EACB_flow.FK_Project;"
     
     
            'Indiquer au Combobox d'afficher la table retournée de TableRqst
            Dim MyRoot As DataTable = TableRqst(rqSql_Root, "Location")
            Dim MyNode1 As DataTable = TableRqst(rqSql_Nod1, "Location")
     
            For Each RootRow As DataRow In MyRoot.Rows
                TheTreeview.Nodes.Add(RootRow.Item(1))
     
                'For Each Node1row As DataRow In MyNode1.Rows
                If interfaceNode Is Nothing OrElse interfaceNode.Text <> RootRow.Item(1) Then
                    interfaceNode = rootNode.Nodes.Add(MyRoot.Rows.Item(1).ToString)
                    interfaceNode.Nodes.Add(MyNode1.Rows.Item(1).ToString)
                    'Console.WriteLine(RootRow.Item(1))
                End If
            Next RootRow
    Je desirerai obtenir la chose suivante :

    Location_Name 1
    + Project_Name 1 of Location_Name 1
    + Project_Name 2 of Location_Name 1
    + Project_Name 3 of Location_Name 1
    Location_name 2
    + Project_Name 1 of Location_Name 2
    + Project_Name 2 of Location_Name 2
    Location Name 3
    + Aucun Projet pour Location_Name 3

    Je ne sais absolument pas comment y arriver.
    Quelqu'un pourrait il me mettre sur la voie de la connaissance?

    Merci d'avance

    Anax
    Images attachées Images attachées  

  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
    le mieux serait d'utiliser un datareader plutot qu'un datatable, ca sera plus rapide

    dans les grandes lignes avec une seule requete ca donnerait :

    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
     
     Dim rqnodes As String = "SELECT Location_Name, Project_Name, Comentaire FROM Project " & _
                    "INNER JOIN (Location INNER JOIN EACB_flow ON Location.PK_Location = EACB_flow.FK_Location) " & _
                    "ON Project.PK_Project = EACB_flow.FK_Project ORDER BY Location_Name"
     
    'definition de la connexion
    (...)
    executereader
    dim treenodeloc as treenode ' contient le dernier treenode location ajouté
    while reader.Read
        dim loc as string = reader.getstring(0)
        dim proj as string = reader.getstring(1)
     
        if treenodeloc is nothing orelse treenodeloc.text  <> loc  then ' changement de location, donc création d'un nouveau node location
            treenodeloc = new treenode
            treeview.nodes.add(treenodeloc)
            continue while ' on passe au suivant
        end if
     
       'node loc est toujours le meme
       dim tn as new treenode
       tn.text = proj
       treenodeloc.nodes.Add(tn)
    end while

    si tu ne sais pas utiliser le reader, voir ici : http://plasserre.developpez.com/vsommair.htm

    et pour info commentaire prend 2 "m"
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 127
    Points : 61
    Points
    61
    Par défaut
    Merci pour ta réponse
    J'ai deux petit pb ds ce que tu me montres :

    1) Je n'obtiens que 2 retours car je vois que 2 noderoot se dessiner. cela ne serait il pas du à la requete?

    2) rien ne s'affiche (niveau données). J'ai juste les "-" du noderoot qui s'affiche

    Anax

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 127
    Points : 61
    Points
    61
    Par défaut
    voici un petit lien que je cherche a reproduire avec ma datable
    http://www.wwwcoder.com/main/parenti...8/default.aspx

    Anax

  5. #5
    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
    debug en pas à pas pour voir ce que ca donne

    sinon j'ai oublié d'affecter treenodeloc.Text

    et la requete tu peux regarder ce qu'elle retourne
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 127
    Points : 61
    Points
    61
    Par défaut
    Merci pour tes conseilles qui m'ont amené à progresser fortement ds mon code.
    Donc voici le code qui marche avec la datatable
    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
     
            'Initialisation de la chaîne contenant l'instruction SQL
            Dim rqSql_Root As String = "SELECT * FROM Location ORDER BY Location_Name;"
            Dim rqSql_Nod1 As String = "SELECT PK_Location, PK_Project, Project_Name FROM Project " & _
                    "INNER JOIN (Location INNER JOIN EACB_flow ON Location.PK_Location = EACB_flow.FK_Location) " & _
                    "ON Project.PK_Project = EACB_flow.FK_Project;"
     
            Dim MyRoot As DataTable = TableRqst(rqSql_Root, "Location")
            Dim MyNode1 As DataTable = TableRqst(rqSql_Nod1, "Location")
     
            For Each RootRow As DataRow In MyRoot.Rows
                rootNode = TheTreeview.Nodes.Add(RootRow.Item(0), RootRow.Item(1))
                For Each Node1row As DataRow In MyNode1.Rows
                    If Node1row.Item(0) = rootNode.Name Then nextNode = rootNode.Nodes.Add(Node1row.Item(1), Node1row.Item(2))
                Next Node1row
            Next RootRow
    Il me reste un seul pb : comment faire pour que s'il n'y a pas de chil, il n'y ait qu'une seule fois d'ecrit : Rien?

    Merci d'avance

    Anax

  7. #7
    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
    Citation Envoyé par Anaxagore Voir le message
    Il me reste un seul pb : comment faire pour que s'il n'y a pas de chil, il n'y ait qu'une seule fois d'ecrit : Rien?

    pas compris


    au lieu de rester sur tes acquis, tu ferais mieux d'essayer d'utiliser le datareader

    le datatable n'apporte rien ici, et il est beaucoup moins performant
    de plus le datatable ne fait qu'utiliser un datareader pour se remplir
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 127
    Points : 61
    Points
    61
    Par défaut
    Merci. Juste pour information : je n'ai pas d'acquis puisque je suis en train d'apprendre comment se servir de cet outils.
    Ok je vais essayer via le reader. Je vais chercher comme faire une fonction avec le reader afin juste de passer les paramètres et éviter de me taper le code à chaque fois.
    Désolé si je t'ai donner l'impression de connaitre.

    Anax

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 127
    Points : 61
    Points
    61
    Par défaut
    Bon je suis pas loin de la vérité avec le datareader

    Voici le code
    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
     
            'Initialisation de la chaîne contenant l'instruction SQL
            Dim rqSql_Root As String = "SELECT * FROM Location ORDER BY Location_Name;"
            Dim rqSql_Nod1 As String = "SELECT PK_Location, PK_Project, Project_Name FROM Project " & _
                    "INNER JOIN (Location INNER JOIN EACB_flow ON Location.PK_Location = EACB_flow.FK_Location) " & _
                    "ON Project.PK_Project = EACB_flow.FK_Project;"
            Dim rqSql_Nod11 As String = "SELECT FK_Project, PK_EACB_Dflow, Commentaire, D_Dde, I_Dde FROM EACB_flow;"
     
     
            Dim Mycommand As OleDbCommand = oCnx.CreateCommand()
            'Mycommand.CommandText = rqSql_Root
     
            Try
                oCnx.Open()
     
                Mycommand.CommandText = rqSql_Root
                'Extraction des données avec libération automatique de la connexion à la Db -> mettre dans les parentheses : CommandBehavior.CloseConnection
                Dim rRoot As OleDbDataReader = Mycommand.ExecuteReader()
                Do While rRoot.Read()
                    rootNode = TheTreeview.Nodes.Add(rRoot.Item(0), rRoot.Item(1))
                Loop
                rRoot.Close()
     
                Mycommand.CommandText = rqSql_Nod1
                'Extraction des données avec libération automatique de la connexion à la Db
                Dim rNode1 As OleDbDataReader = Mycommand.ExecuteReader()
                Do While rNode1.Read()
                    'Console.WriteLine("dans 2nd while " & rNode1.Item(0) & " " & rNode1.Item(1) & " " & rNode1.Item(2))
                    For i As Integer = 0 To TheTreeview.Nodes.Count - 1
                        Console.WriteLine(i & " " & TheTreeview.Nodes(i).Name & " " & rNode1.Item(0))
                        If rNode1.Item(0) = TheTreeview.Nodes.Item(i).Name Then nextNode = TheTreeview.Nodes.Item(i).Nodes.Add(rNode1.Item(1), rNode1.Item(2))
                        'If TheTreeview.Nodes(i).Nodes(0).Name Is Nothing Then nextNode = TheTreeview.Nodes.Item(i).Nodes.Add("rien")
                    Next
                Loop
                'Console.WriteLine("fin 2nd while")
     
     
            Catch ex As Exception
                MessageBox.Show("Database connection is impossible! " & ex.Message)
            End Try
            oCnx.Close()
    le résultat est le suivant :

    Location_Name 1
    Location_name 2
    + Project_Name 1 of Location_Name 2
    + Project_Name 2 of Location_Name 2
    Location Name 3
    Location Name 4
    Location_name 5
    + Project_Name 1 of Location_Name 5
    + Project_Name 2 of Location_Name 5


    J'aurais voulu savoir comment faire pour que je puisse avoir :
    Location_Name 1
    + Pas de projet
    Location_name 2
    + Project_Name 1 of Location_Name 2
    + Project_Name 2 of Location_Name 2
    Location Name 3
    + Pas de projet
    Location Name 4
    + Pas de projet
    Location_name 5
    + Project_Name 1 of Location_Name 5
    + Project_Name 2 of Location_Name 5

    A la place de l'écran précédent

    Merci d'avance

    Anax

  10. #10
    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
    tu peux rajouter à la fin du traitement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for each tn as treenode in montreeview.nodes
      if tn.nodes.count = 0 then
         dim t as new treenode
         t.text = "Pas de projet"
         tn.nodes.Add(t)
       end if
    next
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 127
    Points : 61
    Points
    61
    Par défaut
    Merci bcp tu m'as donner de tres bonnes idées
    ton code fonctionne parfaitement et j'en ai aussi changé le mien en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                Do While rNode1.Read()
                    For Each rootNode As TreeNode In TheTreeview.Nodes
                        If rNode1.Item(0) = rootNode.Name Then
                            rootNode.Nodes.Add(rNode1.Item(1), rNode1.Item(2))
                        ElseIf rootNode.Nodes.Count = 0 Then
                            rootNode.Nodes.Add("pas de projet")
                        End If
                    Next
                Loop
    Par contre j'essaye de comprendre pourquoi sur le dernier il me rajoute "pas de projet" alors qu'il y a quelque chose

    Anax

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

Discussions similaires

  1. C# remplir TreevIew
    Par jpo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/05/2014, 14h31
  2. [Débutant] Remplir treeview avec un datatable
    Par Snowjia dans le forum VB.NET
    Réponses: 9
    Dernier message: 08/07/2013, 20h39
  3. remplir treeview a partir d'un datatable
    Par hachdotnet dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/03/2009, 12h13
  4. Remplir datagrid depuis sql server
    Par ndiayebass dans le forum C#
    Réponses: 1
    Dernier message: 30/04/2008, 09h49
  5. [C#] Remplir treeview depuis string[] de paths
    Par joujoukinder dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/12/2006, 11h06

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