Treeview aux fonctions étendues [Résolu]

Signaler
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011
-
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011
-
Bonjour à tous,
J'ai une base de données qui intègre 3 tables thème, article, couleur.
J'arrive bien à remplir mon treeview avec les éléments en mode hierarchique (merci JesusOnLine !!)
Ce que je voudrais, dans l'absolu, c'est (un peu à la manière du Inbox d'outlook) placer en gras le noeud s'il y a du stock dans la couleur et placer le Nombre d'articles de cette couleur (entre parenthèse).
J'ai vu qu'il existait des contrôles étendus payants mais je ne suis pas chaud pour intégrer des contrôles "exautiques" (surtout que j'utilise celà dans un updatepanel ajax...).
Si quelqu'un à une idée de comment procéder, merci d'avance.
@ bientôt

10 réponses

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

Je ne sais pas si cela peut répondre à tes attentes, mais tu peux regarder du côté de renderpretext et renderposttext, et éventuellement t'inspirer de ceci :

http://www.aspfr.com/forum/sujet-TREEVIEW_1199969.aspx

Pour ton cas, tu pourrais adapter en écrivant plutôt (exemple rudimentaire, à améliorer, d'après l'exemple donné dans le lien) :

Protected Overrides Sub RenderPretext(ByVal writer As HtmlTextWriter)
            If IsNothing(Me.itemgras) = False Then
                writer.RenderBeginTag(HtmlTextWriterTag.B)
                MyBase.RenderPreText(writer)
            End If
        End Sub
 Protected Overrides Sub RenderPostText(ByVal writer As HtmlTextWriter)
            If IsNothing(Me.itemgras) = False Then
                writer.Write(" (" & Me.itemgras & ")")
                writer.RenderEndTag()
                MyBase.RenderPostText(writer)
            End If
  End Sub

...en créant une public property nommée "itemgras", l'idée étant ici que si 'itemgras' n'est pas défini, le noeud se rend normalement tandis que s'il est défini (par exemple avec un nombre représentant ton stock), le noeud est rendu en gras avec sur le côté, entre parenthèses, le nombre en question.
En principe, tu pourras le remplir via ton code, et tu pourras probablement (enfin je crois) l'intégrer en ajax.

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

En principe, tu ne devrais pas avoir besoin de repeupler ton arbre à chaque fois sur le oninit, à moins que outre les noeuds, tu crées aussi ton arbre en dynamique, dans un placeholder.
Mais si l'arbre est déclaré dans l'asp en statique, tu peux très bien le peupler lors du premier page load (en faisant un test pour voir si la page n'est pas postback) par exemple, ou même ajouter des noeuds ensuite sur un autre événement.
Dans le post que tu cites, je répondais à une question qui avait été posée avant et qui ne concernait pas la classe complète, mais une version réduite (celle qui est donnée tout au début du post).
Si le formatage ajouté par 'itemgras' ne se conserve pas entre les postback, c'est peut-être qu'il y a un problème dans saveviewstate() et loadviewstate(), qui sont précisément là pour conserver ce formatage.
En fait, le treeview ainsi modifié devrait être utilisable à peu près comme un treeview de base.
Eventuellement, tu peux montrer le code par lequel tu remplis tes noeuds et la classe modifiée (en message privé peut-être).

GGtry
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011

Merci à toi ggtry !
J'ai comrpis le principe et je pense que c'est la solution!
MAIS (il y en a tjs un, non ??) j'ai un osuci dans l'intégration du namespace dans ma page.
L'intégration dans mon code behind ne pose aucun souci (c'est déjà ça ..).
Au niveau de ma page aspx, il accepte bien :
<%

@
Register
TagPrefix="toto"
Namespace="Arbre" %>

mais pas le controle lui-même (MonArbre n'est pas un élément connu) :

<toto:MonArbre
ID="TreeView1"
runat="server"
ExpandDepth="0"
ImageSet="Simple"

NodeIndent="15"
ShowLines="True">

<ParentNodeStyle
Font-Bold="False"
/>

<HoverNodeStyle
Font-Underline="True"
ForeColor="#DD5555"
/>

<SelectedNodeStyle
Font-Underline="True"
ForeColor="#DD5555"

HorizontalPadding="0px"
VerticalPadding="0px"
/>

<NodeStyle
Font-Names="Verdana"
Font-Size="8pt"
ForeColor="Black"

HorizontalPadding="0px"
NodeSpacing="0px"
VerticalPadding="0px"
/>

</toto:MonArbre>

C'est certainement un Pb de culture (je n'ai jamais eu à utiliser de controles utilisateurs avant).

J'ai bien tenté de place ce code dans un ascx mais là, c'est carémment toto qu'il refuse ..
Tu as une idée ? une piste ?? un bon tuto ????
Merci d'avance
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011

En fait, le placement dans un ascx me donne exactement le même résultat.
La directive :

<%

@
Register
TagPrefix="toto"
TagName="WebUserControl"
Src="~/WebUserControl.ascx" %>

Le Pb viendrait-il du code lui-même ? Ci dessous le code (mais il est très proche de ta solution initiale)

Namespace

Arbre

Public
Class TreeViewEtendu

Inherits TreeView

Protected
Overrides
Function CreateNode()
As System.Web.UI.WebControls.TreeNode

Return
New TreeViewEtenduNoeud()

End
Function

End
Class

Public
Class TreeViewEtenduNoeud

Inherits TreeNode

Private nbr
As
Integer

Public
Property itemgras()
As
Integer

Get

Return nbr

End
Get

Set(
ByVal Value
As
Integer)nbr = Value

End
Set

End
Property

Protected
Overrides
Sub RenderPretext(
ByVal writer
As HtmlTextWriter)

If IsNothing(
Me.itemgras) =
False
Thenwriter.RenderBeginTag(HtmlTextWriterTag.B)

MyBase.RenderPreText(writer)

End
If

End
Sub

Protected
Overrides
Sub RenderPostText(
ByVal writer
As HtmlTextWriter)

If IsNothing(
Me.itemgras) =
False
Thenwriter.Write(

" (" &
Me.itemgras &
")")writer.RenderEndTag()

MyBase.RenderPostText(writer)

End
If

End
Sub 

Protected
Overrides
Function SaveViewState()
As
Object

Dim arrState(2)
AsObjectarrState(0) MyBase.SaveViewState()arrState(1)

Me.itemgras

Return arrState

End
Function

Protected
Overrides
Sub LoadViewState(
ByVal savedState
As
Object)

If
Not savedState
Is
Nothing
Then

Dim arrState()
As
Object = savedState

Me.itemgras =
CType(arrState(1),
Boolean)

MyBase.LoadViewState(arrState(0))

End
If

End
Sub

End
ClassEnd

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

Tu as peut-être mis ton code dans le fichier de code-behind : tapage.aspx.vb ?
Si c'est cela, place le plutôt dans un fichier class.vb qui sera mis dans ton dossier App_Code ("ajouter un nouvel élément", etc.)

GGtry
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011

C'est tout à fait celà !!
Quand j'évoquais un Pb de culture ...
Merci à toi,
je vais tester tout ça et te fais un retour.
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011

bonjour ggtry,
ça marche nettement mieux !!
Mais (encore un ??) je n'arrive pas à conserver itemgras après le postback.
Je m'explique :
j'arrive bien à avoir le Nbr d'article en gras lorsque je déploie le treeview au premier lancement mais dès que je clic dessus, il le retire.
Si je tente d'ouvrir une autre couleur, le itemgras n'apparait pas non plus (alors que si je déploie n'importe quel couleur avant ce premier postback, j'ai bien le itemgras qui s'affiche).
J'ai désactivé le saveviewstate et loaviewstate mais ça ne change rien.
Par contre, si je désactive le viexstate sur le treeview1, je retrouve mes items (sauf que l'arbre se repli au postback).
Une idée ??
Encore merci pour ton aide précieuse ..
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011

OK,
en regardant en bas de ton post sur le sujet, j'ai remarqué que tu proposais de placer le code de remplissage dans le onInit du treeview.
Ben ça marche nickel !
Mais dans ces conditions, je dois repeupler l'arbre à chaque fois, donc interroger la base, recréer l'arbre, etc ...
Mais c'est la seule solution, j'imagine ?
Bien que je ne vois pas pourquoi il perd uniquement cette propriété ...
Et là se pose encore le Pb ... de culture !! Je vais finir agriculteur si ça continue ...
Quoi qu'il en soit, un GRAND MERCI à toi ggtry pour ton aide précieuse !!!!!!!


 
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011

Bonne idée !!
Je vais t'envoyer ça ..
Merci
Messages postés
240
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
18 février 2011

Pour clore le sujet et suite à nos échanges privé, le code de ggtry fonctionne A LA PERFECTION.
Le Pb de disparition des "itemgras" était lié à un copier/coller "à la sauvage" qu'il fallait adapter :

Me.itemgras = CType
(arrState(1), Boolean)

modifé en :

Me.itemgras = CType
(arrState(1), Integer)
car, dans mon cas, itemgras est un integer ... pas un boolean.

MERCI a ggtry pour son aide !!!
bon code à tous.