Treeview [Résolu]

Signaler
Messages postés
5
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
12 septembre 2008
-
Messages postés
5
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
12 septembre 2008
-
Bonjour,

Je suis en train de créer une Treeview.

Pour chacun de ses nodes, je voudrai ajouter une image qui me permettrai d'ajouter un élément fils.
J'utilise déja l'image ImageURL pour afficher une icône devant le texte de ma node.

Je voudrais ajouter l'image pour l'ajout d'un fils aprés ce texte.

Quelqu'un a t il une solution?

Merci d'avance,

10 réponses

Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Sur ton code, NodeText fait référence à quoi exactement ?

Je t'envoie un exemple (mais c'est une class vb, je ne connais le c#) qui pourrait faciliter la chose peut-être, avec une classe qui hérite de treeview pour pouvoir construire complétement un arbre personnalisé en asp.
J'ai ajouté également une propriété (nommée ici CImage, qui est boolean, et qui détermine si le noeud doit recevoir ou non une image sur la droite).
J'ai fait un test en ajoutant des noeuds enfants sur un clic sur l'imagebutton des noeuds principaux : ça à l'air de marcher correctement.

Code VB :

Imports Microsoft.VisualBasic
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.Services.Protocols

Namespace Arbre
    Public Class MonArbre
        Inherits TreeView
        Protected Overrides Function CreateNode() As System.Web.UI.WebControls.TreeNode
            Return New arbrenoeud()
        End Function
    End Class


    Public Class arbrenoeud
        Inherits TreeNode
        Protected Overrides Sub RenderPostText(ByVal writer As HtmlTextWriter)
            If CImage2 = False Then Return
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "image")
            writer.AddAttribute(HtmlTextWriterAttribute.Src, "et1.png")
            writer.AddAttribute("alt", "image2")
            writer.AddAttribute("onclick", "poster(this)")
            writer.RenderBeginTag(HtmlTextWriterTag.Input)
            writer.RenderEndTag()
            MyBase.RenderPostText(writer)
        End Sub
        Private CImage2 As Boolean
        Public Property CImage() As Boolean
            Get
                Return CImage2
            End Get
            Set(ByVal Value As Boolean)
                CImage2 = Value
            End Set
        End Property


        Protected Overrides Function SaveViewState() As Object
            Dim arrState(2) As Object
            arrState(0) = MyBase.SaveViewState()
            arrState(1) = Me.CImage
            Return arrState
        End Function


        Protected Overrides Sub LoadViewState(ByVal savedState As Object)
            If Not savedState Is Nothing Then
                Dim arrState() As Object = savedState
                Me.CImage = CType(arrState(1), Boolean)
                MyBase.LoadViewState(arrState(0))
            End If
        End Sub
    End Class


End Namespace

Dans ma page,

en y ajoutant :
<%@ Register TagPrefix="toto" Namespace="Arbre" %>
je peux écrire en statique, par exemple :

<toto:MonArbre ID="treeview1" runat="server">
    <Nodes>
    <toto:ArbreNoeud Text="Premier Noeud" CImage="true" ImageUrl="et2.png" Value="1">
        <toto:ArbreNoeud Text="Texte1" ImageUrl="et2.png"  Value="Texte1"></toto:ArbreNoeud>
        <toto:ArbreNoeud Text="Texte2" ImageUrl="et2.png" Value="Texte2"></toto:ArbreNoeud>
    </toto:ArbreNoeud>
    <toto:ArbreNoeud Text="Deuxi&#232;me Noeud" CImage="true" ImageUrl="et2.png" Value="2">
        <toto:ArbreNoeud Text="Texte4" ImageUrl="et2.png" Value="Texte4"></toto:ArbreNoeud>
        <toto:ArbreNoeud Text="Texte5" ImageUrl="et2.png" Value="Texte5"></toto:ArbreNoeud>
    </toto:ArbreNoeud>
    </Nodes>
</toto:MonArbre>

GGtry
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Bonsoir,

Tu peux essayer peut-être avec RenderPostText, qui permets d'écrire de l'html après le texte des noeuds du TreeView, et donc d'ajouter une image ou un imageButton. Je ne crois pas qu'il y ait de solution directe en asp.
Ca peut être un peu pénible à gérer toutefois...

GGtry
Messages postés
5
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
12 septembre 2008

bonjour,

Merci pour l'info. Je n'avais pas du tout vu ce champs.

Je test de suite.



plus thy avance, plus thy recule ...
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Bonjour,

Désolé, je n'ai pas été précis : renderposttext s'utilise à travers une classe.
Un exemple (le plus simple à faire, mais pas forcément le plus simple à gérer car tu devras créer ton treeview en dynamique, par le code) avec un imagebutton (en vb) :

Public Class arbrenoeud
        Inherits TreeNode
        Protected Overrides Sub RenderPostText(ByVal writer As HtmlTextWriter)
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "image")
            writer.AddAttribute(HtmlTextWriterAttribute.Src, "Ton fichier image")
            writer.AddAttribute("alt", "image2")
            writer.RenderBeginTag(HtmlTextWriterTag.Input)
            writer.RenderEndTag() 
        End Sub
    End Class

(mais le problème sera de retrouver quel imagebutton a été pressé pour savoir où ajouter un childnode...)

GGtry
Messages postés
5
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
12 septembre 2008

Le problème de savoir quelle image button a été pressé est résolu en ajoutant uen fonction javascript :
par exemple :
writer.AddAttribute(HTMLTextWriterAttribute.Onclick, "alert(" + this.Value + ");");


Par contre, en utilisant cette méthode, l'event javascript s'effectue, et l'arbre et raffraichi, mais sans valeur au noeud.


Je réécrit alors la méthode SaveViewState et LoadviewState



    protected override object SaveViewState()
    {
        object[] arrState = new object[2];
        arrState[0] = base.SaveViewState();
        arrState[1] = this.NodeText;



        return arrState;
    }



    protected override void LoadViewState(object savedState)
    {
        if (savedState != null)
        {
            object[] arrState = savedState as object[];



            this.NodeText = (string)arrState[1];
            base.LoadViewState(arrState[0]);
        }
    }


Par contre là, j'ai un problème lorsque l'arbre se raffraichie.
"
The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request.  For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
"


Je comprend pas du tout pourquoi il dit ne pas reconnaitre les éléments de l'arbre.



plus thy avance, plus thy recule ...
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Pour saveviewstate etc., je ne peux pas trop t'aider immédiatement...
Mais que veux-tu dire exactement par "l'arbre est rafraîchi, mais sans valeur au noeud" ?
Comment crées-tu ton arbre ? et à quel moment ?

GGtry
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Ah oui, un petit oubli :
ce que j'ai fait sur CImage est assez idiot. Plutôt qu'une valeur booléenne, il vaudrait mieux changer et y mettre le nom de fichier de l'image à afficher à droite... et modifier le test en conséquence. Ca permettra de changer facilement l'image à afficher au besoin.

GGtry
Messages postés
5
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
12 septembre 2008

Gros merci ...

Pour répondre à ta question, le NodeText est une chaîne de caractère correspondant au text à afficher.
en fait, je veux que chaque noeud ait la forme :
<Text> <CImage>

En réalisant ce que j'ai fait, le <Text> n'apparait pas.



plus thy avance, plus thy recule ...
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
21 juillet 2010
1
Bonjour,

Pour ton problème de disparition de texte, et l'autre problème avec loadviewstate.
En fait, le problème 1/ se pose probablement du fait que tu ajoutes les noeuds principaux lors du onload (dans ce cas, il faudrait mettre enableviewstate à false, mais cela pourrait poser problème pour les ajouts faits ensuite). En le faisant sur OnInit, le problème devrait ne pas se poser et tu n'aurais plus besoin du loadviewstate. Cela dit, l'ajout de nouveau noeud à l'aide du bouton risque à son tour d'être problèmatique : il vaut donc mieux utiliser le code plus complet que j'ai envoyé, qui ne devrait pas poser problème.
Pour le problème 2/ (et plus généralement), tu peux regarder ici : http://www.csharper.net/blog/adding_controls_dynamically_to_a_page_in_asp_net.aspx

GGtry
Messages postés
5
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
12 septembre 2008

Le problème (si on peut vraiment appelé ça un problème en connaissant la raison) a été résolu.

En tout cas, gros merci pour le temps que tu as consacré pour m'aider à custumiser le treeview.





plus thy avance, plus thy recule ...