Problème avec LinkButton dans un Custom Control [Résolu]

Signaler
Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008
-
Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008
-
Bonjour tout le monde, ma question porte un évènement qui ne se déclenche pas lors d'un clic dans un custom control.


En gros, je dois créer un composant table qui permette de calculer
automatiquement des totaux, sous-totaux... J'ai donc un contrôle
Colonne (Héritant de TableCell) et un contrôle Table (Héritant de
Table), une Table comprenant plusieurs Colonnes (logique ).


Le rajout de ligne se fait sur un binding de liste que je fais à partir d'une requête SQL.


Le contrôle fonctionne, omis un "petit" détail, le tri !


Pour gérer cela, j'ai rajouté un LinkButton, et créé un évènement
associé, qui va récupérer certaines données pour réexecuter la requête
SQL et rebinder ma liste de TableRows dans le bon ordre et selon la
colonne cliquée :

/// <summary>
/// Délégué pour le tri
/// </summary>
publicdelegatevoid ColumnEventHandler(object sender,int? index);
 
/// <summary>
/// Evènement de tri
/// </summary>
publicevent ColumnEventHandler HyperLinkClick;
 
/// <summary>
/// Sur clic de la colonne
/// </summary>
///

protectedvoid OnHyperLinkClick(EventArgs e)
{
if(this.HyperLinkClick != null)
{
//Récupération d'un index
this.HyperLinkClick(this,this.Index);
}
}
 
/// <summary>
/// Nom de la colonne
/// </summary>
publicstring Name {get; set; }
 
 
/// <summary>
/// Init du contrôle
/// </summary>
///

protectedoverridevoid OnInit(EventArgs e)
{
this.ID = string.Format("Column{0}", this.Name.Trim().Replace(" ",""));
this.linkButton.ID = string.Format("Link{0}", this.Name.Trim().Replace(" ",""));
 
this.linkButton.Click += new EventHandler(linkButton_Click);

 
base.OnInit(e);
}
 
 
/// <summary>
/// Clic sur la colonne
/// </summary>
///

///

void linkButton_Click(object sender, EventArgs e)
{
//Appel de l'évènement
this.OnHyperLinkClick(e);
}

Le problème, c'est que je ne passe jamais dans l'évènement, il effectue un PostBack, mais c'est tout.


Et aussi, je ne crois pas faire de la bonne façon, mais là il se trouve
que je me trouve dans le contrôle Colonne. Ma requête SQL se trouve
dans un aspx (pas de requêtes effectuées dans le contrôle, prérogatives
à respecter). Je dois donc remonter les infos jusqu'à mon aspx (index
pour le tri).


Ce que je fais, pour l'instant, et qui me semble un peu crado, c'est
que je récupère l'event de ma Colonne dans un event de ma Table, que je
récupère l'event de cette Table dans un event de mon UserControl (Table
étant contenu dans un UserControl, oui, j'aurais pu m'en passer), et
qu'enfin, je récupère l'event de mon UserControl dans mon aspx, où je
décide de réexecuter ma requête ( ce qui ne fonctionne de toute façon
pas car, comme dit plus haut, pas de passage dans l'event de ma
colonne...).


Ainsi, dans mon aspx je peux faire :

<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
 
/// <summary>
/// Init de la page
/// </summary>
///

protectedoverridevoid OnInit(EventArgs e)
{
this.UserControl1.ColumnClick += new PageTest.TestEventHandler(UserControl1_ColumnClick);
base.OnInit(e);
}
 
/// <summary>
/// Clic sur une colonne
/// </summary>
///

///

 
void Analytic1_ColumnClick(object sender, int? index)
{
this.FillList(index);
}
 
publicvoid FillList(int? index)
{
//Remplissage de ma requête SQL
}
 
 

<!-- END TEMPLATE: bbcode_code -->

J'ai pensé utiliser un __doPostBack, mais je ne sais pas si c'est une meilleure idée.

J'ai cherché pour mon soucis, et cela viendrait du fait que vu que mon contrôle est recréé à chaque fois, et que donc je ne peux pas entrer dans l'évènement.


Si vous avez des réponses à mes questions, je vous remercie de votre
aide ^^. Et espère avoir été clair, et le plus concis possible.

je quote tu quotes...

6 réponses

Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008

J'ai trouvé, il fallait que je réorganise tout au niveau des évènements de pages et de contrôles. (tout mettre dans le load).
Merci.



je quote tu quotes...
Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008

J'ai rajouté à mon linkButton un OnClientClick:

this.linkButton.OnClientClick = this.Page.GetPostBackEventReference(this.linkButton, this.linkButton.ID);

Ca marche, je récupère bien les infos passées dans le GetPostBackEventReference, mais c'est moche... Y'a pas moyen que je passe par mon système d'évènements ?
Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008

Bon, encore un changement, j'ai modifié ma classe comme ceci, voir si cela avait un impact... :

/// <summary>
        /// Init du contrôle
        /// </summary>
        ///

        protected override void OnInit(EventArgs e)
        {

            this.ID = "Column";

            this.linkButton.ID = "LinkButton";
           

            this.linkButton.Click += new EventHandler(linkButton_Click);

            base.OnInit(e);

            this.EnsureChildControls();
        }

 /// <summary>
        /// Création du contrôle
        /// </summary>
        /// <returns></returns>
        protected Panel CreateControl()
        {
            Panel panel = new Panel();

            this.linkButton.Text = this.Name;
            panel.Controls.Add(this.linkButton);

            this.linkButton.CssClass = "label";

            return panel;
        }

        /// <summary>
        /// Ajout du contrôle Panel
        /// </summary>
        protected override void CreateChildControls()
        {
            this.Controls.Add(this.CreateControl());

            base.CreateChildControls();
        }

/// <summary>
        /// Chargement du ViewState
        /// </summary>
        ///

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            this.EnsureChildControls();
        }

Mais toujours rien, même si je charge le ViewState, pas de passage de dans l'event de mon linkButton.... Je craaaaaaaque !
je quote tu quotes...
Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008

En me renseignant encore un peu plus, il se pourrait que l'évènement ne se déclenche pas  car les contrôles sont rajoutés trop tard au contrôle parent. J'ai donc rajouté les contrôles directement dans le OnInit, et fais appel à l'évènement dans le OnLoad de mon Contrôle... Mais ça ne marche pas toujours pas !

/// <summary>
        /// Init du contrôle
        /// </summary>
        ///

        protected override void OnInit(EventArgs e)
        {
            this.ID = string.Format("Column{0}",this.Name.Trim().Replace(" ",""));

            this.linkButton.ID = string.Format("LinkButton{0}", this.Name.Trim().Replace(" ", ""));
            this.linkButton.Text = this.Name;

            this.linkButton.Text = this.Name;
            this.Controls.Add(this.linkButton);

            

            this.linkButton.CssClass = "label";
 
          

            base.OnInit(e);

            this.EnsureChildControls();
        }

/// <summary>
        /// Chargement du contrôle
        /// </summary>
        ///

        protected override void OnLoad(EventArgs e)
        {
            this.linkButton.Click += new EventHandler(linkButton_Click);

            base.OnLoad(e);
        }

        void linkButton_Click(object sender, EventArgs e)
        {
            this.OnHyperLinkClick(e);
        }
Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008

Petite précision, le contrôle global, la Table, se trouve dans une page Ajaxisée.
Messages postés
51
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
4 décembre 2008

Ajaxée, pardon.

je quote tu quotes...