Voilà, c'est ma première contribution, donc merci de votre indulgence si j'oublie des choses ou si je n'ai pas encore la bonne présentation.
Je vais tenter de vous faire un exposé clair de l'idée et de sa mise en oeuvre.

Donc l'idée c'est de nourrir un TreeView avec des informations venant d'une BDD au lieu d'un fichier XML. Donc il n'y a pas de XmlDataSource.
Sur al gpe vous posez juste un TreeView, tout seul avec un seul apramettre, voici le code minimal, ensuite vous agrémentez comme bon vous semble :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
<asp:TreeView ID="TV" runat="server" EnableViewState="false"></asp:TreeView>
Maintenant voyons la BDD : il faut que vous métiez en place un objet de BDD (vues, proc stock, fonction, table, ...) qui aura la structure suivante :
Identifiant, Libelle, Parent.

Ceci partant du principe que le Parent va être égal à un identifiant sur un autre enregistrement, donc même type de données. Respectez également l'ordre des champs.

Enfin, le CodeBehind, les explications sont dans le code en commentaire :
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
 
'à partir du PageLoad il faut remplir le ou les premiers noueds du TreeView avec  ce code qui peut trés bien être dans une Sub déportée
Dim dt As DataTable = dm.ExecuterRequeteSimple("SELECT Identifiant, Libelle FROM lobdjetBDD WHERE Parent is null ORDER BY Parent")
'le ORDER c'est à vous de voir, ça peut être un autre champ qui serait ajouter en bout de ligne.
'la clause WHERE sert à déterminer le ou les noeuds de plus haut niveau, j'ai mis du NULL, j'aurais pu mettre un autre identifiant, 0 par exemple.
'Le chargement dans une DataTable est ce que j'ai trouvé de plus simple car j'ai un FrameWork perso qui me renvoi une DataTable en deux lignes de code 
	For Each dr As DataRow In dt.Rows
		Dim NewNode As New TreeNode(dr(1), dr(0))
'là, on emploi les index de champs, histoire que ce soit plus facile, donc l'ordre des champs....
		NewNode.PopulateOnDemand = True
		NewNode.Expanded = False
		NewNode.SelectAction = TreeNodeSelectAction.None
'c'est trois lignes là sont là pour l'exemple, parce que mon besoin à l'origine est comme ça, mais c'est là qu'on bricole le noeud pour lui donner l'apprence et les fonctions que l'on souhaite. Un With est certainemnt sympa.
		TV.Nodes.Add(NewNode)
	Next
 
'ensuite on active le PopulateOnDemand du TreeView pour remplir à la suite à chaque fois qu'un noeud se présente.
Protected Sub TV_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TV.TreeNodePopulate
Dim dtn As DataTable = dm.ExecuterRequeteSimple("SELECT Identifiant, Libelle FROM lobdjetBDD WHERE Parent = " & e.Node.Value & "ORDER BY Parent")
'Donc, là on récupère le niveau où l'on est pour remplir la suite d'où le e.Node.Value
	For Each dr As DataRow In dtn.Rows
		Dim NewNode As New TreeNode(dr(1), dr(0))
		NewNode.PopulateOnDemand = True
		NewNode.Expanded = False
		NewNode.SelectAction = TreeNodeSelectAction.None
		e.Node.ChildNodes.Add(NewNode)
	Next
'Et on recommence le même travail que précédement, sauf que l'ajout final n'est pas le même, on ajoute au noeud et pas au TreeView direct.
End Sub
Voilà, j'espère que ça va aider certains. Pour améliorer on peut mettre au point un Fonction déportée pour travailler le Noeud à la place d'un With répété dans le deux procédures, il suffira de retourner un TreeNode.

Par contre prenez bien garde à la performance des requête. Tel qu'il est fait là, le serveur va chercher dans la base à chaque clique sur un "plus", mais surtout, la page ne donne pas l'impression de cherche, peut être un point à améliorer avec un petit truc qui bouge pour dire que ça charge.

Si vous avez des question, évitez les MP, ma boite se remplirai trop vite, mais je vous promets de passer ici à chauqe fois que j'aurais une alerte message pour y répondre.