Salut,

J'ai développé un composant type branche d'arbre qui est un peu plus évolué que les TreeNodes natives.

Ce contrôle affiche les données de la branche dans une <tr> et ses descendants dans une seconde <tr> escamotable.

Le contrôle s'appelle EZAdvancedTreeViewNode

J'ai créé un EventArg comme suit :
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
 
    public class EZAdvancedTreeViewExpandEventArgs : EventArgs
    {
        public int NodeId { get; set; }
        public string NodeFullPath { get; set; }
        public bool RefreshChildren { get; set; }
        public EZAdvancedTreeViewNode InitialSender { get; set; }
        public EZAdvancedTreeViewExpandEventArgs(int nodeId, string nodeFullPath, bool refreshChildren,EZAdvancedTreeViewNode initialSender)
        {
            this.NodeId = nodeId;
            this.NodeFullPath = nodeFullPath;
            this.RefreshChildren = refreshChildren;
            this.InitialSender = initialSender;
        }
    }
ainsi qu'un délégué :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
public delegate void EZAdvencedTreeViewNodeExpandedEventHandler(object sender, EZAdvancedTreeViewExpandEventArgs e);
Voici une classe partielle abstraite qui instancie les évènements :
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
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
namespace EZ.Objects.PresentationLayer.Components.EZAdvancedTreeViewObjects
{
    public abstract class AdvancedTreeViewBase : System.Web.UI.UserControl
    {
        public event EZAdvencedTreeViewNodeCheckedChangedEventHandler CheckedChanged;
        protected virtual void onCheckedChanged(EZAdvancedTreeViewEventArgs e)
        {
            EZAdvencedTreeViewNodeCheckedChangedEventHandler newHandler = CheckedChanged;
            if (newHandler != null)
            {
                newHandler(this, e);
            }
        }
        public event EZAdvencedTreeViewNodeExpandedEventHandler NodeExpand;
        protected virtual void onNodeExpand(EZAdvancedTreeViewExpandEventArgs e)
        {
            EZAdvencedTreeViewNodeExpandedEventHandler newHandler = NodeExpand;
            if (newHandler != null)
            {
//newHandler toujours null si profondeur supérieure à 1
                newHandler(this, e);
            }
        }
    }
}
Le contrôle ainsi généré capte bien les évènements du premier niveau (de profondeur) mais je comporte tout à fait aléatoirement pour les niveaux suivants.

J'ai trouvé ce code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);
    Load += new EventHandler(Page_Load);
}
qui devrait me permettre de bien instancier mes évenments mais, comme je fabrique dynamiquement les contrôles enfants (puisque il n'est pas possible de référencer un contrôle dans lui même)

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
 
protected override void CreateChildControls()
        {
...
   imb.Click += new ImageClickEventHandler(imb_Click);
...
        }
 
        protected void imb_Click(object sender, ImageClickEventArgs e)
        {
            this.Expanded = !this.Expanded;
            CreateChildControls();
            //Execution du premier évènement déclaré sous la page
            this.onNodeExpand(new EZAdvancedTreeViewExpandEventArgs(this.NodeId, this.NodesIdPath, true, this));
 
        }
 
        protected void N_NodeExpand(object sender, EZAdvancedTreeViewExpandEventArgs e)
        {
//Propagation de l'évènement entre les couches
               onNodeExpand(e);
        }
Je pense qu'il faut empiler les évènements mais je ne sais pas faire.

Quelqu'un pourrait m'aider ?

D'avance merci

Laurent

, je ne sais pas comment et surtout quand forcer le déclenchement du pré init