[3.5] Propagation d'évènements dans une pile de contrôles de même type
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:
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:
1 2
|
public delegate void EZAdvencedTreeViewNodeExpandedEventHandler(object sender, EZAdvancedTreeViewExpandEventArgs e); |
Voici une classe partielle abstraite qui instancie les évènements :
Code:
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:
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:
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