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

ASP.NET Discussion :

Treeview - Comment Reload et Rebind un Treeview avec une nouvelle source de données ?


Sujet :

ASP.NET

  1. #1
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut Treeview - Comment Reload et Rebind un Treeview avec une nouvelle source de données ?
    Bonjour,


    Je suis en train de développer une page contenant un contrôle TreeView.
    Je ne maîtrise pas tout à fait ce composant et j'aimerais poser quelques questions.


    Présentation de mon TreeView

    Je remplis mon TreeView à partir d'informations issues d'une base de données.
    J'ai pas de DataSource pour le treeview.

    Ce que je fais actuellement pour peupler mon Treeview :
    - Je choisit un couple année/mois dans une dropDownList
    - je fais ma requête en base de données avec en paramètre l'année et le mois choisis.
    - J'enregistre les résultats dans une liste que je met en variable de session.
    - Je peuple mes différentes nodes (les différents niveaux hiérarchiques) de mon TreeView dynamiquement quand je développe une node. Grâce à la propriété PopulateOnDemand et l'évènement PopulateNode.
    Dans PopulateNode, j'applique une logique de peuplement à partir de ma liste en variable de session.


    En gros :
    => node racine, niveau 0 = Couple mois/année sélectionnée dans la dropDownList
    => node niveau 1 = Jours : (ma source de données me renvoie tous mes objets modifiés durant le mois sélectionnée. J'affiche la liste des jours où j'ai effectué des modifications.)
    => node niveau 2 = Utilisateur : (liste des utilisateurs ayant modifié les données durant le jour séléctionné)



    Ce que je veux faire


    Actuellement, j'arrive à peupler le treeview, mais qu'une seule fois.

    Ce que je veux faire, c'est que quand je sélectionne un autre couple mois année dans ma dropdownlist, que mon treeview soit modifié en conséquence.

    Et là je bloque. Je sais pas comment faire.

    Quand ma dropDownList change, je récupère mon couple (mois/année), je fais ma requête en base de données avec ces paramètres et je récupère une liste.
    Donc j'ai ma liste de données pour le treeview, pour le couple/mois année sélectionné, et après qu'est ce que je fais ??
    Comment faire pour lier cette nouvelle source de données à mon treeview, à la place de l'ancienne ?


    J'ai l'impression que je ne peux plus appeler l'évènement PopulateNode...
    Je pensais peut être à 'rétracter' jusqu'au noeud racine pour ensuite pouvoir le repeupler dynamiquement quand je développe les nodes...
    Mon Treeview garde en mémoire les anciennes données..


    Pouvez vous m'aider ??


    [EDIT]

    J'ai trouvé.
    Tout simplement, dans mon évènement 'SelectedIndexChanged' de ma DropDownList, après avoir récupéré ma nouvelle source de données et l'avoir mis en variable de session, j'appelle la méthode CollapseAll() sur mon TreeView.
    Grâce à elle, mon Treeview se "rétracte" jusqu'au noeud racine et quand je le re-développe, l'évènement "PopulateNode" est appelé.

    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
    protected void TreeView1_PopulateNode(object sender, TreeNodeEventArgs e)
        {
            switch (e.Node.Depth)
            {
                case 0:
                    GetMonths(e.Node);
                    break;
                case 1:
                    GetDays(e.Node);
                    break;
                case 2:
                    GetUsers(e.Node);
                    break;
            }
        }
    Et donc après, les différentes méthodes (GetMonths, GetDays, GetUsers) utilisent bien la nouvelle liste de donnée pour repeupler les nodes.


    => En fait non j'ai re-testé et ça ne fonctionne pas du tout comme ça.
    Quand je re-développe mon TreeView, après l'avoir fermé avec ColapseAll(), les données sont les anciennes données.
    Le programme ne passe plus par les évènement PopulateNode.
    Mais c'est un peu le comportement que je souhaiterais obtenir en fait, que l'évènement PopulateNode soit appelé à chaque fois.
    Comment faire cela ? C'est possible ?



    [/EDIT]

  2. #2
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut
    A force de tests, et aussi en relisant les docs MSDN, j'ai fini par comprendre.

    J'ai ma DropDownList des mois et mon TreeView.
    (Les n° ci dessus ne définissent pas un ordre. C'est juste pour marquer les points à retenir.)

    1. J'ai mis la propriété EnableViewState de mon TreeView à false.

    2. C'est dans l'évènement SelectedIndexChanged de ma DropDownList que je repeuple ma variable de session à chaque fois.
    => Je récupère les données globales du mois sélectionné.

    3. Dans le même évènement OnSelectedIndexChanged, j'efface toutes les nodes à chaque fois, je recrée la node racine en mettant sa propriété PopulateOnDemand à true.

    4. J'ai enfin compris que l'évènement PopulateNode était déclenché quand on développe une node (quand on appuie sur le petit bouton '+'). C'est donc quand j'appuie sur le '+' que mes nodes sont repeuplées.
    Donc dans mes méthodes GetMonths(e.Node), GetDays(e.Node) ..., méthodes appelées dans PopulateNode dans ma boucle switch/case,
    je filtre ma variable de session (données globales du mois), en fonction de ce que je veux obtenir.

    5. A chaque fois, quand je crée une node, je met dans sa propriété "Value" les informations de ses nodes parents. (avec un séparateur => "|")

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

Discussions similaires

  1. [CR XI] Appel d'un rapport avec une autre source de données
    Par tarekos dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 17/06/2008, 10h44
  2. Creer une nouvelle source de donnée avec BIRT
    Par mazraelle dans le forum BIRT
    Réponses: 1
    Dernier message: 01/08/2007, 14h35
  3. Comment ne pas saturer l'ordi avec une boucle ?
    Par jenez dans le forum Windows
    Réponses: 5
    Dernier message: 30/09/2006, 23h01
  4. Réponses: 9
    Dernier message: 30/09/2006, 00h20
  5. Comment créer un site immobilier dynamique avec une base de données ?
    Par Alain troverti dans le forum Général Conception Web
    Réponses: 14
    Dernier message: 07/07/2006, 21h57

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