Treeview

Résolu
thybang Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 12 septembre 2008 - 9 sept. 2008 à 16:13
thybang Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 12 septembre 2008 - 12 sept. 2008 à 16:49
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

ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
11 sept. 2008 à 18:59
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
3
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
10 sept. 2008 à 20:31
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
0
thybang Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 12 septembre 2008
11 sept. 2008 à 14:50
bonjour,

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

Je test de suite.



plus thy avance, plus thy recule ...
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
11 sept. 2008 à 15:22
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
thybang Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 12 septembre 2008
11 sept. 2008 à 16:51
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 ...
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
11 sept. 2008 à 18:05
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
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
11 sept. 2008 à 19:07
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
0
thybang Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 12 septembre 2008
12 sept. 2008 à 11:03
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 ...
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
12 sept. 2008 à 13:51
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
0
thybang Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 12 septembre 2008
12 sept. 2008 à 16:49
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 ...
0
Rejoignez-nous