thybang
Messages postés5Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention12 septembre 2008
-
9 sept. 2008 à 16:13
thybang
Messages postés5Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention12 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.
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 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.
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 :
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 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
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
thybang
Messages postés5Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention12 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
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.
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 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
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 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.
thybang
Messages postés5Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention12 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.
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 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