SQL et requête pour remplissage d'un treeview en vb.net
Bonjour,
J'ai un problème mais je ne trouve rien pour le résoudre...
Mon cas : j'ai un treeview à remplir à partir d'une table dans ma base de données sql (sous sql server 2005).
Non, ne dites pas que ce topic doit être déplacer en forum DOTNET car le problème vient de la requête SQL.
Voici la forme de la table :
colonne idQualif (int) -> identifiant unique clé primaire
colonne libelle (varchar(50)) -> libelle
colonne idParent (int) -> numéro d'identifiant du parent (à NULL si noeud root)
Et en code behind aspx.vb :
Code:
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 50 51 52
| Imports System.Data.SqlClient
Imports System.Data
Partial Class qualification
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
PopulateRootLevel()
End If
End Sub
Private Sub PopulateRootLevel()
Dim objConn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("ChaineConnection").ConnectionString)
Dim objCommand As New SqlCommand("select idQualification, libelle, (select count(*) FROM qualificationLibelle qL WHERE idParent=qL.idQualification) childnodecount FROM qualificationLibelle WHERE idParent IS NULL", objConn)
Dim da As New SqlDataAdapter(objCommand)
Dim dt As New DataTable()
da.Fill(dt)
PopulateNodes(dt, TreeView1.Nodes)
End Sub
Private Sub PopulateSubLevel(ByVal idParent As Integer, ByVal parentNode As TreeNode)
Dim objConn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("ChaineConnection").ConnectionString)
Dim objCommand As New SqlCommand("select idQualification, libelle, (select count(*) FROM qualificationLibelle qL WHERE idParent=qL.idQualification) childnodecount FROM qualificationLibelle WHERE idParent=@idParent", objConn)
objCommand.Parameters.Add("@idParent", SqlDbType.Int).Value = idParent
Dim da As New SqlDataAdapter(objCommand)
Dim dt As New DataTable()
da.Fill(dt)
PopulateNodes(dt, parentNode.ChildNodes)
End Sub
Private Sub PopulateNodes(ByVal dt As DataTable, ByVal nodes As TreeNodeCollection)
For Each dr As DataRow In dt.Rows
Dim tn As New TreeNode()
tn.Text = dr("libelle").ToString()
tn.Value = dr("idQualification").ToString()
nodes.Add(tn)
'If node has child nodes, then enable on-demand populating
tn.PopulateOnDemand = (CInt(dr("childnodecount")) > 0)
Next
End Sub
Protected Sub TreeView1_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodePopulate
PopulateSubLevel(CInt(e.Node.Value), e.Node)
End Sub
End Class |
La première requête en rouge doit sélectionner l'id et le libelle et le nombre de fils des noeuds root. Cependant, le (select count (*)...) renvoi toujours 0.
La deuxième requête en rouge doit sélectionner l'id et le libelle et le nombre de fils des noeuds suivants. Cependant, le (select count (*)...) renvoi toujours 0.
Lorsque j'essaye d'afficher mon arbre, je vois seulement les 2 noeuds root sous la forme :
..... Noeud 1
|
..... Noeud 2
Pouvez-vous m'aider à construire ma requête ???
Merci
Représentation intervallaire ?
Bonsoir,
Si votre abrorescence est surtout accédée en lecture.
Avez vous lu cet article de SQLPro ?
Vous y trouverez comment gérer un arbre en SQL, bien plus proprement qu'avec une auto jointure, sans problème de récursivité, et aussi toutes les requêtes nécessaires.
@+