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 :

Ajout dynamique de treeviews/eventHandler


Sujet :

ASP.NET

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut Ajout dynamique de treeviews/eventHandler
    Bonjour messieurs/dames !

    [DISCLAIMER]
    je suis un utilisateur nouveau du C# alors soyez indulgents svp !
    [/DISCLAIMER]


    Après avoir recherché quelques heures (si si, je vous assure), je me décide a poster un sujet parceque je ne m'en sors pas de ce problème !!!

    Allons zy !

    Alors c'est assez simple:
    Je voudrais afficher dans la partie gauche un treeview issu d'un fichier XML construit de la facon suivante :
    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
    30
    31
    32
    33
    34
     
    <?xml version="1.0" encoding="utf-8" ?>
    <Root val="MyTreeView">
      <Chapter val="chapter1">
        <Num val="1"></Num>
        <Page val="4"></Page>
        <Description val="chapter1 description"></Description>
        <SubChapter val="subChapter1">
          <Num val="1"></Num>
          <Page val="5"></Page>
          <Description val="subChapter1 description"></Description>
          <SubSubChapter val="subSubChapter1">
            <Num val="1"></Num>
            <Page val="6"></Page>
            <Description val="subSubChapter1 description"></Description>
          </SubSubChapter>
          <SubSubChapter val="subSubChapter2">
            <Num val="2"></Num>
            <Page val="7"></Page>
            <Description val="subSubChapter2 description"></Description>
          </SubSubChapter>
        </SubChapter>
        <SubChapter val="subChapter2">
          <Num val="2"></Num>
          <Page val="8"></Page>
          <Description val="subChapter2 description"></Description>
        </SubChapter>
      </Chapter>
      <Chapter val="chapter2">
        <Num val="2"></Num>
        <Page val="9"></Page>
        <Description val="chapter2 description"></Description>
      </Chapter>
    </Root>
    Ensuite, lors d'un click sur un noeud de l'arbre, je veux mettre à jour une table placée dans la partie gauche de la page avec les informations contenue dans le noeud sélectionné selon le code C# suivant :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    protected void treeview_SelectNodeChanged(Object sender, EventArgs e)
        {
            System.Web.UI.WebControls.TreeView origin = (System.Web.UI.WebControls.TreeView)sender;
     
            //si le noeud déclenchant l'évènement n'a pas de fils
            if (origin.SelectedNode.ChildNodes.Count == 0)
            {
                //on met à jour le label titre avec le text du noeud parent
                titre.Text = origin.SelectedNode.Parent.Value;
                //on récupère les noeuds qui sont au même niveau que celui sélectionnés
                foreach (System.Web.UI.WebControls.TreeNode current in origin.SelectedNode.Parent.ChildNodes)
                {
                    TableCell cl1 = new TableCell();
     
                    //si le noeud courant n'a pas de fils
                    if (current.ChildNodes.Count == 0)
                    {
                        //on rempli la cellule avec le texte du noeud courant
                        cl1.Text = current.Text;
                    }
                    else
                    {
                        //sinon on créé un nouveau treeview et on lui ajoute un clone du noeud courant
                        System.Web.UI.WebControls.TreeView tv = new System.Web.UI.WebControls.TreeView();
                        tv.Nodes.Add((System.Web.UI.WebControls.TreeNode)Cloner.CloneTreeNode(current));
                        //on lui associe un event auquel on lie la fonction
                        tv.SelectedNodeChanged += new EventHandler(treeview_SelectNodeChanged);
                        //on le met dans la cellule
                        cl1.Controls.Add(tv);
                    }
     
                    //on créé ensuite un textBox éditable contenant la valeur du noeud courant
                    System.Web.UI.WebControls.TextBox edit = new System.Web.UI.WebControls.TextBox();
                    edit.Text = current.Value;
                    //on l'ajoute à la cellule
                    TableCell cl2 = new TableCell();
                    cl2.Controls.Add(edit);
     
                    //on ajoute les cellules à une ligne
                    TableRow tr = new TableRow();
                    tr.Cells.Add(cl1);
                    tr.Cells.Add(cl2);
     
                    //on ajoute la ligne dans la table
                    valeurs.Rows.Add(tr);
                }
            }
            else
            {
                //on met à jour le label titre avec le text du noeud sélectionné
                titre.Text = origin.SelectedNode.Text;
     
                //on récupère les noeuds fils du noeud sélectionné
                foreach (System.Web.UI.WebControls.TreeNode current in origin.SelectedNode.ChildNodes)
                {
                    TableCell cl1 = new TableCell();
     
                    //si le noeud courant n'a pas de fils
                    if (current.ChildNodes.Count == 0)
                    {
                        //on rempli la cellule avec le texte du noeud courant
                        cl1.Text = current.Text;
                    }
                    else
                    {
                        //sinon on créé un nouveau treeview et on lui ajoute un clone du noeud courant
                        System.Web.UI.WebControls.TreeView tv = new System.Web.UI.WebControls.TreeView();
                        tv.Nodes.Add((System.Web.UI.WebControls.TreeNode)Cloner.CloneTreeNode(current));
                        //on lui associe un event auquel on lie la fonction
                        tv.SelectedNodeChanged += new EventHandler(treeview_SelectNodeChanged);
                        //on le met dans la cellule
                        cl1.Controls.Add(tv);
                    }
     
                    //on créé ensuite un textBox éditable contenant la valeur du noeud courant
                    System.Web.UI.WebControls.TextBox edit = new System.Web.UI.WebControls.TextBox();
                    edit.Text = current.Value;
                    //on l'ajoute à la cellule
                    TableCell cl2 = new TableCell();
                    cl2.Controls.Add(edit);
     
                    //on ajoute les cellules à une ligne
                    TableRow tr = new TableRow();
                    tr.Cells.Add(cl1);
                    tr.Cells.Add(cl2);
     
                    //on ajoute la ligne dans la table
                    valeurs.Rows.Add(tr);
                }
            }
            origin.SelectedNode.Selected = false;
        }
    une image valant bien des mots, voici ce que j'obtient :


    Je n'ai donc pas de problèmes pour faire ceci, mais mon problème se situe au niveau de ce morceau de code :
    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
     
    //si le noeud courant n'a pas de fils
                    if (current.ChildNodes.Count == 0)
                    {
                        //on rempli la cellule avec le texte du noeud courant
                        cl1.Text = current.Text;
                    }
                    else
                    {
                        //sinon on créé un nouveau treeview et on lui ajoute un clone du noeud courant
                        System.Web.UI.WebControls.TreeView tv = new System.Web.UI.WebControls.TreeView();
                        tv.Nodes.Add((System.Web.UI.WebControls.TreeNode)Cloner.CloneTreeNode(current));
                        //on lui associe un event auquel on lie la fonction
                        tv.SelectedNodeChanged += new EventHandler(treeview_SelectNodeChanged);
                        //on le met dans la cellule
                        cl1.Controls.Add(tv);
                    }
    donc pour les explications, lorsque le noeud a afficher dans la table possèdent des fils qui ne sont pas des feuilles, j'ajoute un treeview dans la cellule correspondante en ajoutant a sa collection de noeud un clone du noeud en question (entre parenthèses, j'ai été surpris de voir qu'il n'y avait pas de méthode clone (je ne parle pas de memberviseclone) implémenté dans les objets C#, si ca vous interesse d'avoir un cloner de treenode, tell me !)

    Ensuite je veux ajouter un event (c'est le même que pour le treeview parent) au treeview nouvelement créé ! Le problème c'est que quand je click sur mon nouveau treeview, aucun event n'est lancé...ou plutôt si, juste celui de reload de la page

    Alors pour vous prouver que j'ai recherché, j'ai mis la main sur un exemple ou l'on disait qu'il fallait utiliser le ViewState pour créer l'objet dans le pageload afin de l'ajouter dans l'arborescence des controles de la page...
    j'ai bien compris l'idée, seulement l'exemple donné concernait un seul objet a créer dans la page alors que dans mon cas j'ai plusieurs objets a créer dynamiquement (je n'en connais pas le nombre à l'avance et ils n'ont pas d'ID puisque j'utilise une variable locale de création "tv") dans des cellules de lignes d'une table...

    je pense pouvoir contourner le problème en utilisant une variable globale de collection de treeview que je mettrai a jour et que je créérai dans le pageload en fonction du ViewState... mais ca me parait bizarre d'avoir a faire quelque chose d'aussi compliqué dans un langage objet ! et en plus c'est moche !

    c'est clair ce que je dis ou bien ?

    j'espère que l'un ou l'une de vous saura me renseigner !

    ciao!

    Etienne.

  2. #2
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    Je crains, eut égard à mes faibles compétences en C#, que ce ne soit moche... Je ne vois pas trop d'autres solutions sur le moment...

  3. #3
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Ah, l'éternel problème des contrôles créés dynamiquement.
    Regarde un peu dans le forum, tu trouveras la solution.

  4. #4
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Hola ! c'est rapide !

    euh, ben ouais, c'est une solution qui doit fonctionner mais bon c'est quand même bien bourrin quoi...

    le c# cay le mal...

    d'autres idées ??

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Citation Envoyé par guitoux1
    Ah, l'éternel problème des contrôles créés dynamiquement.
    Regarde un peu dans le forum, tu trouveras la solution.
    moui...j'ai déjà vu pas mal de tomics relatif a cela mais j'ai bien du mal à les relier à mon problème... et les solutions me paraissent souvent lourdes...
    menfin, je vais continuer a chercher ! merci !

  6. #6
    Membre Expert Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Par défaut
    regarde la réponse de Sphax

    http://www.developpez.net/forums/sho...=362667&page=2

    cela devrait te donner des idées pour retrouver tes petits.. enfin j'espere, c'est que je m'y perds un peu moi dans tous ces trucs a la fin

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Citation Envoyé par Sphax
    Pour conserver les valeurs des controles dynamiques il n'y a rien à faire sinon penser à les recréer au bon moment lors du postback. Tu peux par exemple le faire dans une surcharge de CreateChildControl de la page. Surtout ne pas réinventer le viewstate ce serait dommage .

    Voici le code d'une page qui contient un bouton et un placeholder, qd on clique sur le bouton j'ajoute une textbox au placeholder. Les valeurs des textbox sont bien conservées d'un postback à l'autre. La seule chose conservée explicitement dans le viewstate est le nombre de textbox à créer :

    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
    30
    31
    32
    33
    34
    35
    36
     
    private int TotalDynamicControls
    		{
    			get
    			{
    				if (ViewState["TotalDynamicControls"] == null)
    				{
    					return 0;
    				}
     
    				return (int)ViewState["TotalDynamicControls"];
    			}
     
    			set
    			{
    				ViewState["TotalDynamicControls"] = value;
    			}
    		}
     
    		protected override void CreateChildControls()
    		{
    			base.CreateChildControls();
     
    			for (int i = 0; i < TotalDynamicControls; ++i)
    			{
    				TextBox tmp = new TextBox();
    				phHolder.Controls.Add(tmp); //phHolder c'est mon placeHolder
    			}
    		}
     
    		protected void Button1_Click(object sender, EventArgs e)
    		{
    			TextBox tmp = new TextBox();
    			phHolder.Controls.Add(tmp);
    			TotalDynamicControls++;
    		}

    voilà la réponse de sphax au problème. C'est bien ce que j'avis compris, mais le problème c'est que je ne sais pas comment récupérer les infos de mon treeview parent...parceque ce n'est pas qu'un text, c'est une collection de noeuds qui eux mêmes ont potentiellement une collection de fils...et ainsi de suite !


    EDIT:je vais quand même tester ca, même si j'arrive pas a comprendre comment il arrive a récupérer les infos des controles...

  8. #8
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Tu peux stocker dans le ViewState la référence à "current" (noeud actuellement sélectionné). Puis dans la méthode CreateChildControl, ben tu remet le code de Clonage de treeView. Tu sauras quel TV cloner car tu auras la référence dans le viewstate

  9. #9
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Citation Envoyé par guitoux1
    Tu peux stocker dans le ViewState la référence à "current" (noeud actuellement sélectionné). Puis dans la méthode CreateChildControl, ben tu remet le code de Clonage de treeView. Tu sauras quel TV cloner car tu auras la référence dans le viewstate
    ok , mais alors dans ce cas la, je ne peux plus faire de la manière expliquée par sphax...
    en effet, parceque je ne peux certainement pas faire passer toutes les références de noeuds...
    dois-je alors passer la référence dans le ViewState et relancer le CreateChildeControl à chaque fois que je créé un nouveau treeview ??

    et un autre truc me chiffonne...je créé dynamiquement des treeview, ok mais j'en créé à chaque fois que je change de node sélectionné, puis si je reviens au premier noeud, je vais les recréer...alors dans l'arborescence des controles, je vais en ajouter à l'infini !!

    autre question, comment je récupère le contentplaceholder ? n'est-pas pareil de faire un this.Controls.Add(monTreeView)...??

  10. #10
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    je créé dynamiquement des treeview, ok mais j'en créé à chaque fois que je change de node sélectionné, puis si je reviens au premier noeud, je vais les recréer...alors dans l'arborescence des controles, je vais en ajouter à l'infini !!
    Non car justement, du fait que tes contrôles sont créés dynamiquement, il ne sont pas dans le ViewState de ta page. Donc pas "persistent". Donc quand tu créé un TV dans la méthode CreateChildControl, le précédent n'est plus présent dans le placeHolder.

    C'est pareil que dans le code se Sphax. Il recréé TOUTES les textbox à chaque fois dans la méthode CreateChildControl

  11. #11
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    ok ok, je commence a comprendre... c'est quand même vachement compliqué, surtout pour ce que ca doit finalement faire...

    Donc, pour résumer, je fais un truc du genre :
    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
     
        //dans mon event
        protected void treeview_SelectNodeChanged(Object sender, EventArgs e)
        {
            ViewState["node"] = (TreeNode)current;
            this.Controls.Add(new TreeView());
            //ca ca lance le CreateChildControls
        }
     
        //dans mon CreateChildControls
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
     
            TreeView tmp = new TreeView();
            tmp.Nodes.Add(Cloner.CloneTreeNode((TreeNode)ViewState["node"]));
     
            this.Controls.Add(tmp);
        }
    mais après, je fais comment pour le mettre dans ma ligne et dans ma table ??
    je vais quand même pas faire tout ca dans le CreateChildControls ?? si ??

    je suis désolé si j'ai un peu de mal mais comme dit, je suis pas expert en C# et la ca fait beaucoup de concepts en même temps !

    EDIT:ca me saoule d'autant plus car j'arrive à les afficher ces treeview et que je n'ai besoin d'eux que pour un click...je veux juste que l'event soit lancé !!!

  12. #12
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    je suis désolé si j'ai un peu de mal mais comme dit, je suis pas expert en C# et la ca fait beaucoup de concepts en même temps !
    Faut dire tu commence par un des trucs les plus "dur". Beaucoup de gens se sont cassé les dents sur l'ajout dynamique de contrôles (moi aussi d'ailleur), et ce depuis la version 1.0 de DotNet !!

    mais après, je fais comment pour le mettre dans ma ligne et dans ma table ??
    Ben tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maCellule.Controls.Add(monTreeView);

  13. #13
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    oui, mais ces lignes et ces cellules, je les créés dynamiquement quand mon event est lancé...
    ca m'énerve...

    alors je vais essayer de récpituler ce que je dois faire :

    dans mon event :
    - je créé un treeview (obligé ?? pourquoi faut t'il le créer 2 fois)
    - je récupère mon noeud et je le met dans le ViewState (ca marche pas, ca me met TreeNode non serializable...)
    - je lance la méthode CreateChildControls

    dans mon CreateChildControls, si il y a un node dans le ViewState :
    - je créé ma ligne, mes cellules
    - je créé mon treeview, je le config avec le node récupéré dans le ViewState, je lui associe un event
    - je rempli les cellules, je les mets dans la ligne et je met la ligne dans la table

    c'est ca l'idée ?????


    [EDIT:]

    Bon, comme j'ai pas eu de réponse, j'ai fais comme ca et ca donne ceci :

    dans mon event :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                        ViewState["node"] = Cloner.CloneTreeNode(current);
                        this.CreateChildControls();
    ma fonction CreateChildControls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    protected override void CreateChildControls()
        {
     	 base.CreateChildControls();
     
         if (ViewState["node"] != null)
            {
                MessageBox.Show("Yiiiiiiiiiiiiiiiha");
                System.Web.UI.WebControls.TreeView tv = new System.Web.UI.WebControls.TreeView();
                tv.Nodes.Add((System.Web.UI.WebControls.TreeNode)ViewState["node"]);
                tv.SelectedNodeChanged += new EventHandler(this.treeview_SelectNodeChanged);
                valeurs.Rows.Add(createTableRow(tv, ((System.Web.UI.WebControls.TreeNode)ViewState["node"]).Value));
            }
        }
    j'ai fais un méthode de création de lignes, createTableRow pour pas avoir a me retapper tout le code a chaque fois...


    seulement je ne peux pas tester si ca marche puisqu'apparement je ne peux pas passer de référence de TreeNode par le ViewState !!! L'exec me dit que malheuresement la classe TreeNode n'est pas sérialisable...

    ca commence a me péter les c***lles !!!

    [EDIT2]:
    je vais essayer autre chose...

  14. #14
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Bon, j'arrive a rien...
    Pourquoi c'est aussi compliqué ??
    pourquoi on ne peut pas passer de référence d'objets non sérialisés dans le ViewState ???

    quelqu'un aurait une idée ?? je me prends la tête là et j'en peut plus !
    je ne vois pas du tout comment m'en sortir...je vois bien comment créer des contrôles dynamiquement mais je fais comment pour récuperer mon node racine ???


  15. #15
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Effectivement, le ViewState n'accepte que du serializable et TreeNode ne l'est pas.
    De toute façon, le ViewState pour un gros truc comme ça c'est pas adapté (ca va alourdir ta page au final).
    Je te conseil plutôt de passer l'identifiant du noeud sélectionné dans ton ViewState, genre monNoeud.ID, comme ça tu vas pouvoir le retrouver après dans ton treeview "original" et ainsi récupérer le TreeNode qui correspond.

    Bon je vais essayé de reproduire le truc, tu peux me filer le code de ta méthode de clone de treenode, jé pas trop envie de ma taper tout le code là

    EDIT : Laisse tombé la méthode de clone, c'est fait

  16. #16
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Bon essaie un truc plus comme ça. C'est pas encore parfait, mais tu devrais pouvoir t'e sortir avec ça. Avec le mode debug et un peu de patience, tu trouveras :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
     
            if (ViewState["monNode"] != null)
            {
                TreeNode nodeClique = TreeView1.FindNode(ViewState["monNode"].ToString());
     
                DrawNodeInfos(nodeClique);
            }
        }
     
        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            System.Web.UI.WebControls.TreeView origin = (System.Web.UI.WebControls.TreeView)sender;
     
            ViewState["monNode"] = origin.SelectedNode.ValuePath;
            DrawNodeInfos(origin.SelectedNode);
        }
     
        private void DrawNodeInfos(TreeNode node)
        {
            if (node != null)
            {
                //si le noeud déclenchant l'évènement n'a pas de fils
                if (node.ChildNodes.Count == 0)
                {
                    //on met à jour le label titre avec le text du noeud parent
                    titre.Text = node.Parent.Value;
     
                    //on récupère les noeuds qui sont au même niveau que celui sélectionnés
                    foreach (System.Web.UI.WebControls.TreeNode current in node.Parent.ChildNodes)
                    {
                        TableCell cl1 = new TableCell();
     
                        //si le noeud courant n'a pas de fils
                        if (current.ChildNodes.Count == 0)
                        {
                            //on rempli la cellule avec le texte du noeud courant
                            cl1.Text = current.Text;
                        }
                        else
                        {
                            //sinon on créé un nouveau treeview et on lui ajoute un clone du noeud courant
                            System.Web.UI.WebControls.TreeView tv = new System.Web.UI.WebControls.TreeView();
                            tv.Nodes.Add(Clone(current));
                            //on lui associe un event auquel on lie la fonction
                            tv.SelectedNodeChanged += new EventHandler(TreeView1_SelectedNodeChanged);
                            //on le met dans la cellule
                            cl1.Controls.Add(tv);
                        }
     
                        //on créé ensuite un textBox éditable contenant la valeur du noeud courant
                        System.Web.UI.WebControls.TextBox edit = new System.Web.UI.WebControls.TextBox();
                        edit.Text = current.Value;
                        //on l'ajoute à la cellule
                        TableCell cl2 = new TableCell();
                        cl2.Controls.Add(edit);
     
                        //on ajoute les cellules à une ligne
                        TableRow tr = new TableRow();
                        tr.Cells.Add(cl1);
                        tr.Cells.Add(cl2);
     
                        //on ajoute la ligne dans la table
                        Table1.Rows.Add(tr);
                    }
                }
                else
                {
                    //on met à jour le label titre avec le text du noeud sélectionné
                    titre.Text = node.Text;
     
                    //on récupère les noeuds fils du noeud sélectionné
                    foreach (System.Web.UI.WebControls.TreeNode current in node.ChildNodes)
                    {
                        TableCell cl1 = new TableCell();
     
                        //si le noeud courant n'a pas de fils
                        if (current.ChildNodes.Count == 0)
                        {
                            //on rempli la cellule avec le texte du noeud courant
                            cl1.Text = current.Text;
                        }
                        else
                        {
                            //sinon on créé un nouveau treeview et on lui ajoute un clone du noeud courant
                            System.Web.UI.WebControls.TreeView tv = new System.Web.UI.WebControls.TreeView();
                            tv.Nodes.Add(Clone(current));
                            //on lui associe un event auquel on lie la fonction
                            tv.SelectedNodeChanged += new EventHandler(TreeView1_SelectedNodeChanged);
                            //on le met dans la cellule
                            cl1.Controls.Add(tv);
                        }
     
                        //on créé ensuite un textBox éditable contenant la valeur du noeud courant
                        System.Web.UI.WebControls.TextBox edit = new System.Web.UI.WebControls.TextBox();
                        edit.Text = current.Value;
                        //on l'ajoute à la cellule
                        TableCell cl2 = new TableCell();
                        cl2.Controls.Add(edit);
     
                        //on ajoute les cellules à une ligne
                        TableRow tr = new TableRow();
                        tr.Cells.Add(cl1);
                        tr.Cells.Add(cl2);
     
                        //on ajoute la ligne dans la table
                        Table1.Rows.Add(tr);
                    }
                }
                node.Selected = false;
            }
        }

  17. #17
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Salut !

    merci beaucoup de ton implication !
    désolé de pas avoir répondu avant, j'avais décidé de ne plus regarder ce truc avant d'avoir évacué la haine profonde que cela m'inspirait !!!

    je vais essayer cette méthode et je te tiens au courant !


    ciao !

  18. #18
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    Yeepa !

    Bon, c'est vraiment pas loin de fonctionner comme je le voudrais !

    il reste un dernier problème :
    - Je clique une première fois dans l'arbre parent, ca affiche le contenu du noeud comme il faut
    - Je clique ensuite sur un des treeview de la partie droite, ca affiche bien le contenu de ce noeud
    - Je clique a nouveau sur un des treeview de la partie droite (issus d'un treeview dynamique), ca ne déclanche pas d'event

    Je sais pourquoi, car dans le CreateChildControls, je cherche dans l'arbre parent un noeud qui possède un valuepath relatif au treeview dynamique sur lequel je viens de cliquer...donc il ne retrouve pas le noeud (il renvoie certainement NULL).
    J'ai donc décidé de créer une var static pour sauvegarder une ref du treeview dans lequel il fallait aller chercher le noeud. Le problème c'est que cette variable n'est mise à jour que lorsque l'event est déclenché et donc je perds un tour de click...autrement dit, je click une fois, ca reload la page mais ca ne change rien, je reclick sur le même et ca m'affiche bien le contenu dans la page...

    is it clear ??

    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
     
    //la variable globale de sauvegarde du treeview a considerer
    protected static System.Web.UI.WebControls.TreeView tv_parent;
     
    //le CreateChildControls
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
     
            if (ViewState["Node"] != null)
            {
                System.Web.UI.WebControls.TreeNode node = tv_parent.FindNode(ViewState["Node"].ToString());
                DrawNodeInfos(node);
            }
        }
     
    //l'event
     protected void treeview_SelectedNodeChanged(object sender, EventArgs e)
        {
            System.Web.UI.WebControls.TreeView origin = (System.Web.UI.WebControls.TreeView)sender;
            //mise a jour de la var globale
            tv_parent = origin;
            ViewState["Node"] = origin.SelectedNode.ValuePath;
            DrawNodeInfos(origin.SelectedNode);
        }

  19. #19
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Je sais pas si ça va résoudre ton PB, mais ta varibale static tv_parent est automatiquement vidée entre chaque PostBack (on est en mode SatetLess).
    Utilise plutôt une variable de session pour stocker ton treeview :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private TreeView TVParent 
    {
       get 
       {
          if (Session("tvparent") != null)
             return (TreeView)Session("tvparent");
          else
             return null;
       }
       set
       {
          Session("tvparent") = value;
       }
    }

  20. #20
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Par défaut
    hello !

    ca ne résoud effectivement pas mon problème mais je te remercie bien pour ton aide, je vais abandonner pour l'instant, ya vraiment trop de mécanismes que je ne comprend pas...

    je pense que c'est quand même résolu alors je vais tagger le post quand même !!

    merci beaucoup !

    ciao!

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

Discussions similaires

  1. [VBA] Ajouter dynamiquement une référence
    Par jpharand dans le forum VBA Access
    Réponses: 23
    Dernier message: 16/04/2010, 23h28
  2. Ajout dynamique de colonne identity
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/11/2005, 16h40
  3. ajouter dynamiquement des items dans un popup menu
    Par Malone dans le forum Composants VCL
    Réponses: 7
    Dernier message: 23/08/2005, 16h08
  4. Réponses: 2
    Dernier message: 10/05/2005, 15h54
  5. Ajout dynamique d'un contrôle à une fenêtre
    Par Yacine95000 dans le forum MFC
    Réponses: 6
    Dernier message: 08/06/2004, 16h03

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