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

Contribuez .NET Discussion :

[Source] Nourrir un TreeView avec une base de données


Sujet :

Contribuez .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut [Source] Nourrir un TreeView avec une base de données
    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.

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut


    Si en plus, tu pouvais nous joindre le zip pour qu'on puisse directement tester le truc, ce serait super


  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Mais j'ai pas de zip, pour tester faut copier coller le code dans une page, c'est tout.

    Ou alors tu veux que je fasse un zip avec des apges et des données complète, genre un vrai petit site ?
    Si c'est bien ça, je verrais à la faire, mais un peu plus tard.

  4. #4
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Je suggérais simplement un petit exemple. Avec la BD NorthWind par exemple ou une autre BD au choix qui pourra être intégrée dans le zip

    Citation Envoyé par zoofy
    genre un vrai petit site ?
    Une seule page suffira

  5. #5
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Zooffy,

    si je peux aussi me permettre une petite remarque, si tu en as la possibilité, enlève les "traces" de ton Framework perso car ce ne sera pas utilisable pour tout le monde.

    Il faut aussi préciser que pour que cela fonctionne, il faut que les données dans la BDD soient organisée de façon hiérarchique:
    ID - IDParent de sorte que
    Si IDParent=NULL Alors on a un noeud de premier niveau
    SI IDParent <> NULL Alors on a un noeud de niveau inférieur

    Enfin, le PopulateOnDemand peut être intéressant, mais n'a pas forcément une grande utilité pour charger une petite quantité de données.

  6. #6
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Oui, tu as raison pour le FrameWork, mais je préfère laisser comme ça et dire que :
    tout ce qui commence par dm. fait aprtie du FrameWork, remplacez le par vos méthodes de chargement de DataTable.

    Sinon, tes précisions sur la structure de table, ok, mais je croyais avoir été clair là dessus.
    Peut être un peu trop la tête dans le guidon.
    Disons que tes précisions pourront servir à ceux qui liront ce topic.

    Sinon, monsieur le chef de rubrique (désolé je sais pas qui c'est) on est bien d'accord que le topic va rester comme ça et pas bougé ?

Discussions similaires

  1. Probleme de connexion JDBC avec une base de donne mysql
    Par sultan_kafila dans le forum JDBC
    Réponses: 19
    Dernier message: 12/04/2006, 08h25
  2. treeview avec une base de donnée Access
    Par yannba dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/01/2006, 12h49
  3. Connexion de Delphi avec une base de données Oracle 9i
    Par Price dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/12/2005, 12h38
  4. Gestion des chemins des images avec une base de données...
    Par Nean dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/07/2005, 08h08
  5. probleme avec une base de donnée postgres SQL
    Par Alexlesilex dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/06/2005, 22h09

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