[asp.net]creation de relation parent enfant dans un treeview-

Résolu
harbonne Messages postés 10 Date d'inscription vendredi 19 avril 2002 Statut Membre Dernière intervention 3 mai 2007 - 26 mai 2005 à 12:34
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 - 27 mai 2005 à 11:09
curieuse_asp

Bonjour,

Mon problème est le suivant:

j'aic reé un treeview avec un premier niveau 'parent' et un deuxième niveau 'enfant'.

or il se troiuve qu'avec le code implémenté je vois bien les deux niveaux mais pas la coprresppondance entre chaque terme parent et son terme enfant
ex : je vois les deux niveaux

monohierarchie
espace vert
fraude fiscale
thesaurus
foret
affaire correctionnelle
alors que je voudrais voir ceci en cliquant respectivement sur les libelles : monohierarchie, espace vert et fraude fiscale

monohierarchie
thesaurus
esapce vert
forêt

fraude fiscale
affaire correctionnelle
Je vous informe que les deux tables selectionnées sont la table TERME dont la strucuture est la suivante
ID_TERME, Lib_TERME

La table ASSOCIES dont la strucuture est la suivante
ID_TERME_SOURCE_A, ID_TERME_ASSOCIE
Voici comment cela se passe :

Dans la table ASSOCIEs les deux champs ID_TERME_SOURCE_A et ID_TERME_ASSOCIE contiennent des nombres .Ces deux champs sont liés par une relation d'association : ID_TERME_ASSOCIE est l'associé du ID_TERME_SOURCE du m^me enregistrement.
Les nombres contenus dans ID_TERME_SOURCE_A et ID_TERME_ASSOCIE sont tous des ID_TERME de la table TERME.

Pour connaitre le libellé de chaque ID_TERME_SOURCE_A , ou de chaque ID_TERME_ASSOCIE on fait le lien avec l'ID_TERME de la table TERME et on va chercher le Lib_TERME correspondant.

J'espère que la situation est plus claire à présent

Voici le code implémenté.
Pouuriez vous m'aider à résoudre mon problème car je tourne en rond depuis plusieurs jours maintenant et je finis par me fatiguer!!


Code:
,
----

Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.Web.UI.WebControls
Imports System.Windows.Forms.TreeNode

Public Class TreeView2
Inherits System.Web.UI.Page
Protected WithEvents TreeView2 As Microsoft.Web.UI.WebControls.TreeView
Protected WithEvents label1_affiche_associé As System.Web.UI.WebControls.Label
Protected WithEvents Label2_affiche_associé As System.Web.UI.WebControls.Label

Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadDim sConnString As String "Data Source localhost ; Initial Catalog =THESAURUS ; User Id =""; Password=""; integrated security = SSPI"
Dim objConn As New SqlConnection(sConnString)
objConn.Open()
Dim objDS As New DataSet()
Dim dt1 As DataTable
Dim dt2 As DataTable
Dim dt3 As DataTable
Dim i As Integer
Dim sbuffer1 As String
Dim sbuffer2 As String

'creation(d) 'un Adapter qui se charge des communications entre le Dataset et la source de données

'autre DataAdapter qui va prendre les enfants de dette racine

Dim da1 As New SqlDataAdapter("SELECT T1.Lib_TERME FROM TERME T1, ASSOCIES WHERE T1.ID_TERME=ASSOCIES.ID_TERME_SOURCE_A", objConn)
da2.Fill(objDS, "ASSOCIES_SOURCE")
dt2 = objDS.Tables("ASSOCIES_SOURCE")

Dim da2 As New SqlDataAdapter("SELECT T2.Lib_TERME FROM TERME T1, TERME T2, ASSOCIES WHERE(T1.ID_TERME = ASSOCIES.ID_TERME_SOURCE_A)and T2.ID_TERME =ASSOCIES.ID_TERME_ASSOCIE", objConn)
'je fais un fill avec un nom de table enfant
da3.Fill(objDS, "ASSOCIES")
dt3 = objDS.Tables("ASSOCIES")

objConn.Close()

'création des types de données du tree view
Dim nodeTERME As TreeNode
Dim rowTERME As DataRow
Dim nodeTERME1 As TreeNode
Dim rowTERME1 As DataRow

Dim ChildRow As DataRow

ChildRow = objDS.Tables(1).Rows(0)

For Each rowTERME In objDS.Tables(0).Rows
nodeTERME = New TreeNode()
nodeTERME.Text = rowTERME("Lib_TERME")
TreeView2.Nodes.Add(nodeTERME)

Next

For Each ChildRow In objDS.Tables(1).Rows
nodeTERME1 = ChildRow("Lib_TERME")
nodeTERME.Nodes.Add(nodeTERME1)

Next ChildRow

End Sub

End Class

/code

Merci beaucoup de votre aide encore.

Bien cordialement.
Nathalie

13 réponses

harbonne Messages postés 10 Date d'inscription vendredi 19 avril 2002 Statut Membre Dernière intervention 3 mai 2007
27 mai 2005 à 11:04
Salut!
C'est bon, j'ai trouvé!!!!

A force de reprendre mon code, et mes requêtes sql, j'ai fini par trouver!!!

voici mon code



Imports System.Data


Imports System.Data.SqlClient


Imports Microsoft.Web.UI.WebControls


Imports System.Windows.Forms.TreeNode


Public 
Class TreeView_Test



Inherits System.Web.UI.Page



Protected 
WithEvents TreeView_Test 
As Microsoft.Web.UI.WebControls.TreeView



Protected 
WithEvents label1_affiche_associé 
As System.Web.UI.WebControls.Label



Protected 
WithEvents Label2_affiche_associé 
As System.Web.UI.WebControls.Label



Sub Page_Load(
ByVal sender 
As System.Object, 
ByVal e 
As System.EventArgs) 
Handles 
MyBase.Load



Dim sConnString 
As String "Data Source localhost ; Initial Catalog =THESAURUS ; User Id =""; Password=""; integrated security = SSPI"



Dim objConn 
As 
New SqlConnection(sConnString)


objConn.Open()



Dim objDS 
As 
New DataSet()



Dim dt1 
As DataTable



Dim dt2 
As DataTable



Dim dt3 
As DataTable



Dim i 
As 
Integer



Dim sbuffer1 
As 
String



Dim sbuffer2 
As 
String



'creation(d) 'un Adapter qui se charge des communications entre le Dataset et la source de données





Dim da1 
As New SqlDataAdapter("SELECT T1.Lib_TERME As Lib_Parent, T2.Lib_TERME as Lib_Enfant FROM TERME T1, TERME T2, ASSOCIES WHERE(T1.ID_TERME ASSOCIES.ID_TERME_SOURCE_A)and T2.ID_TERMEASSOCIES.ID_TERME_ASSOCIE ", objConn)


da1.Fill(objDS, "TERME")


dt1 = objDS.Tables("TERME")


objConn.Close()



'création des types de données du tree view



Dim nodeTERME 
As TreeNode



Dim rowTERME 
As DataRow = objDS.Tables(0).Rows(0)



Dim nodeTERME1 
As TreeNode



Dim rowTERME1 
As DataRow



'Dim childrow As DataRow = objDS.Tables(1).Rows(0)



For 
Each rowTERME 
In objDS.Tables(0).Rows



If 
Not (rowTERME.IsNull(objDS.Tables(0).Columns(0))) 
Then


nodeTERME = 
New TreeNode()


nodeTERME.Text = rowTERME("Lib_Parent")


TreeView_Test.Nodes.Add(nodeTERME)


nodeTERME1 = 
New TreeNode()


nodeTERME1.Text = rowTERME("Lib_Enfant")


nodeTERME.Nodes.Add(nodeTERME1)



'End If



End 
If



'End If



Next


End 
Sub


End 
Class





Et puis c'est tout et le résultat est là!


A+ et merci encore


Nathalie


curieuse_asp
3
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 4
26 mai 2005 à 13:34
Salut,

A la fin de ta première boucle "for each" , ton nodeTERME est égal au dernier noeud parent.

Donc quand tu ajoutes les fils à nodeTERME, tu les ajoutes tous au dernier noeud parent. Il faut que tu ajoutes les noeuds fils aux noeuds parents correspondants.
0
harbonne Messages postés 10 Date d'inscription vendredi 19 avril 2002 Statut Membre Dernière intervention 3 mai 2007
26 mai 2005 à 14:41
curieuse_asp

Merci de m'en informer : JUSTEMENT C'EST MON PROBLEME!!!

Ce que j'aimerais c'est avoir une réponse à ce problème!!!

Merci de bien vouloir m'aider dans ce sens!

Cordialement
0
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 4
26 mai 2005 à 14:56
Je n'ai pas bien compris le lien entre tes noeuds parents et leurs fils. Qu'est ce qui te permet de savoir si un noeud possède un fils?
Sinon dans ta première boucle :
For Each...
...
TreeView2.Nodes.Add(nodeTERME)
si nodeTERME a un fils
nodeTERME.add(sonFils)
Next

Sais pas si ça répond mieux (désolé sinon)
@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
harbonne Messages postés 10 Date d'inscription vendredi 19 avril 2002 Statut Membre Dernière intervention 3 mai 2007
26 mai 2005 à 16:27
Bonjour et merci de ta réponse.
Je te communique le code exact implémenté car dans celui transmis dans mon dernier message il y a des erreurs

[code]


Imports System.Data


Imports System.Data.SqlClient


Imports Microsoft.Web.UI.WebControls


Imports System.Windows.Forms.TreeNode


Public
Class TreeView2



Inherits System.Web.UI.Page



Protected
WithEvents TreeView2
As Microsoft.Web.UI.WebControls.TreeView



Protected
WithEvents label1_affiche_associé
As System.Web.UI.WebControls.Label



Protected
WithEvents Label2_affiche_associé
As System.Web.UI.WebControls.Label



Sub Page_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load



Dim sConnString
As String "Data Source localhost ; Initial Catalog =THESAURUS ; User Id =""; Password=""; integrated security = SSPI"



Dim objConn
As
New SqlConnection(sConnString)


objConn.Open()



Dim objDS
As
New DataSet()



Dim dt1
As DataTable



Dim dt2
As DataTable



Dim dt3
As DataTable



Dim i
As
Integer



Dim sbuffer1
As
String



Dim sbuffer2
As
String


Création d'un adapter qui se charge de la communication entre le data set et la source de données



Dim da1
As
New SqlDataAdapter("SELECT T1.Lib_TERME FROM TERME T1, ASSOCIES WHERE T1.ID_TERME=ASSOCIES.ID_TERME_SOURCE_A", objConn)


da1.Fill(objDS, "ASSOCIES_SOURCE")


dt1 = objDS.Tables("ASSOCIES_SOURCE")




'creation d'un autre DataAdapter qui va prendre les enfants de dette racine


Dim da2
As New SqlDataAdapter("SELECT T2.Lib_TERME FROM TERME T1, TERME T2, ASSOCIES WHERE T1.ID_TERME ASSOCIES.ID_TERME_SOURCE_A and T2.ID_TERMEASSOCIES.ID_TERME_ASSOCIE", objConn)



'je fais un fill avec un nom de table enfant


da2.Fill(objDS, "ASSOCIES")


dt2 = objDS.Tables("ASSOCIES")


objConn.Close()



'création des types de données du tree view



Dim nodeTERME
As TreeNode



Dim rowTERME
As DataRow



Dim nodeTERME1
As TreeNode



Dim rowTERME1
As DataRow



For
Each rowTERME
In objDS.Tables(0).Rows


nodeTERME =
New TreeNode()


nodeTERME.Text = rowTERME("Lib_TERME")


TreeView2.Nodes.Add(nodeTERME)



Next



For
Each rowTERME1
In objDS.Tables(1).Rows


nodeTERME1 =
New TreeNode()


nodeTERME1.Text = rowTERME1("Lib_TERME")


nodeTERME.Nodes.Add(nodeTERME1)



Next



End
Sub


End
Class

Tu me poses la question suivante

'Qu'est ce qui te permet de savoir si un noeud possède un fils?'
en fait dans mon code je n'ai pas testé cela, car je n'y connais rien!
Ce qui m'intéresse c'est que pour chaque ID_TERME_SOURCE_A qui est considéré comme le terme Parent, je vois en correspondance le ID_TERME_ASSOCIE qui est le terme ENFANT.
(ou plûtot ce que je veux voir ce qont les libellés correspondant à ID_TERME_SOURCE_A et ID_TERME_ASSOCIE).

Si tu peux m'aider à ce niveau je t'en serais vraiment extrèmement reconnaissante car JE TOURNE EN ROND!!!

Merci beaucoup de ton aide.

ps : le code que tu m'as transmis est une proposition de code à tester?


curieuse_asp
0
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 4
26 mai 2005 à 16:46
Si j'ai bien compris (j'en suis pas sûr ), les données contenues dans dt2 sont les noeuds fils de ceux contenus dans dt1.
Le contenu de dt2 : ce sont des noeuds fils, mais comment savoir de quel noeud père? C'est ça que je ne comprend pas. Sans relation entre un père et son fils, ça me semble difficile à réaliser.
Si par exemple un noeud père est situé sur une branche A, il faut que tu saches pour tous les noeuds fils lesquels ont pour branche père la branche A (Je suis peut-être pas trés clair là ...)
Le petit bout de code (qui n'en est pas vraiment) c'était au cas où tu aurais un champ qui servirai de liaison entre un père et son fils.
Si je peux t'être un peu plus utile, n'hésite pas.
@+
0
harbonne Messages postés 10 Date d'inscription vendredi 19 avril 2002 Statut Membre Dernière intervention 3 mai 2007
26 mai 2005 à 16:58
Bonjour et merci de ton aide.
Tu as bien compris le problème.
Il y a peut être besoin de créer une datarelation entre les deux tables dt1 et dt2.

Tu écris 'Le contenu de dt2 : ce sont des noeuds fils, mais comment savoir de quel noeud père?'
Et bien parce que dans la table ASSOCIES de la base de données SQLSERVER dont je t'ai décrit la structure(et pas la dt2 appelé ASSOCIE) il y a bien deux champs ID_TERME_SOURCE_A et ID_TERME_ASSOCIE ; ce que je veux simplement c'est voir les contenus des deux champs!!(ou plûtot les libellés).
Ce que je peux souligner c'est que ID_TERME_SOURCE_A et ID_TERME_ASSOCIE sont des clés etrangères de la table TERME puisque ID_TERME_SOURCE_A et ID_TERME_ASSOCIE sont tous les deux des ID_ TERME .
Cela fait il avancer le chmilblick ????
Je l'espère tout du moins

Bien cordialement.
Nathalie


curieuse_asp
0
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 4
26 mai 2005 à 17:23
ID_TERME_SOURCE_A et ID_TERME_ASSOCIE sont identiques pour un père et son fils?

J'ai pensé à ça mais je sais pas ce que ça vaut (à mettre après TreeView2.Nodes.Add(nodeTERME)):

Dim DR As DataRow()
Dim dataR As DataRow

DR = dt2.select(dt2.item("ID_TERME_ASSOCIE ") & "=' " & rowTERME.item("ID_TERME_SOURCE_A") & " ' ")

For
Each dataR
In DR
Dim n As new TreeNode(dataR.item(libelleDuFils))
nodeTERME.Nodes.Add(n)
Next

le select() devrait te permettre de récupérer les enregistrements où ID_TERME_SOURCE_A = ID_TERME_ASSOCIE .
Ensuite tu crées un noeud avec le libelle correspondant (fils) que tu ajoutes au noeud père que tu viens de créer.

Teste pour voir. (Si c'est complétement débile, tu as le droit de m'engueuler )
@+
0
harbonne Messages postés 10 Date d'inscription vendredi 19 avril 2002 Statut Membre Dernière intervention 3 mai 2007
26 mai 2005 à 17:48
Rebonjour,

Je te remercie pour ton code.
Je te fais un petit schema des données

ID_TA ID_TERME_SOURCE_A ID_TERME_ASSOCIE
1 36 37
2 37 40
3 58 60
4 59 60
5 54 61
6 65 63
7 66 67
8 67 75

Tu vois bien qu'un ID_TERME_SOURCE_A n'est jamais égal à ID_TERME_ASSOCIE(id_ta est un numùéro incrémenté, qui n'a aucun intérêt pour nous).
Cela te permet-il d'y voir plus clair?
Cordialement.
Nathalie



curieuse_asp
0
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 4
27 mai 2005 à 08:23
Salut,

Je t'avoues que là je suis un peu perdu!

En + les ID_TERME_ASSOCIE contiennent des doublons? Du coup le bout de code que je t'ai donné ne fonctionne pas.
Franchement, je sèche
Je crois qu'il n'y a plus qu' à crier A L'AIDE!!!!!

@+
0
harbonne Messages postés 10 Date d'inscription vendredi 19 avril 2002 Statut Membre Dernière intervention 3 mai 2007
27 mai 2005 à 10:22
Bonjour,

Le problème des doublons est secondaire,; j'ai vraiment écrit des numéros au hasard!!!
Tout ce que je veux c'est que la relation pere-fils entre id_terme_source et id_terme_associe apparaisse!


curieuse_asp
0
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 4
27 mai 2005 à 10:36
Salut,

je ne vois vraiment pas comment faire apparaître cette relation. Il n'y a rien qui nous permet de savoir ce qui relie
ID_TERME_SOURCE_A et ID_TERME_ASSOCIE.

Je pense que ces numéros ne doivent pas être écrits au hasard.

@+
0
cs_drahcir Messages postés 745 Date d'inscription mardi 30 novembre 2004 Statut Membre Dernière intervention 15 septembre 2009 4
27 mai 2005 à 11:09
Salut,

Parfait, j'éspère que je t'ai un tant soit peu aidé. Tu devrais maintenant accepter la réponse (la tienne) pour clore cette discussion.

@+
0
Rejoignez-nous