IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Problème d'Evènement sur contrôle personnalisé


Sujet :

ASP.NET

  1. #1
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut Problème d'Evènement sur contrôle personnalisé
    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 :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
     /// <summary>
            /// Délégué pour le tri
            /// </summary>
            public delegate void ColumnEventHandler(object sender,int? index);
     
            /// <summary>
            /// Evènement de tri
            /// </summary>
            public event ColumnEventHandler HyperLinkClick;
     
            /// <summary>
            /// Sur clic de la colonne
            /// </summary>
            /// <param name="e"></param>
            protected void OnHyperLinkClick(EventArgs e)
            {
                if (this.HyperLinkClick != null)
                {
                   //Récupération d'un index
                   this.HyperLinkClick(this,this.Index);
                }
            }
     
    /// <summary>
            /// Nom de la colonne 
            /// </summary>
            public string Name { get; set; }
     
     
    /// <summary>
            /// Init du contrôle
            /// </summary>
            /// <param name="e"></param>
            protected override void 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>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            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 :

    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
     
    /// <summary>
        /// Init de la page
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            this.UserControl1.ColumnClick += new PageTest.TestEventHandler(UserControl1_ColumnClick);
            base.OnInit(e);
        }
     
    /// <summary>
        /// Clic sur une colonne
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="index"></param>
     
        void Analytic1_ColumnClick(object sender, int? index)
        {
            this.FillList(index);
        }
     
    public void FillList(int? index)
    {
    //Remplissage de ma requête SQL
    }

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

    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.

  2. #2
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    J'ai remarqué que je rajoutais mon linkButton au Contrôle Colonne dans le PreRender, donc après que je fais appel au OnClick de ce même LinkButton, je l'ai rajouté dans le OnInit comme ceci :

    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
     
    /// <summary>
            /// Init du contrôle
            /// </summary>
            /// <param name="e"></param>
            protected override void OnInit(EventArgs e)
            {
     
                this.Controls.Add(this.linkButton);
     
                this.linkButton.Click += new EventHandler(linkButton_Click);
     
                base.OnInit(e);
            }
     
            void linkButton_Click(object sender, EventArgs e)
            {
                this.OnHyperLinkClick(e);
            }
    Mais rien, ne passe toujours pas dedans...

  3. #3
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    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 ?

  4. #4
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    Bon, encore un changement, j'ai modifié ma classe comme ceci, voir si cela avait un impact... :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    /// <summary>
            /// Init du contrôle
            /// </summary>
            /// <param name="e"></param>
            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>
            /// <param name="savedState"></param>
            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 !

  5. #5
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    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 !

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    /// <summary>
            /// Init du contrôle
            /// </summary>
            /// <param name="e"></param>
            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>
            /// <param name="e"></param>
            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);
            }

  6. #6
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    Petite précision, le contrôle global, la Table, se trouve dans une page Ajaxée.

  7. #7
    Membre éclairé Avatar de Ishizaki
    Inscrit en
    Avril 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 262
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème déclenchement Evènement sur CommandButton
    Par ericdev67 dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 30/10/2014, 07h18
  2. Réponses: 2
    Dernier message: 20/10/2010, 11h16
  3. Problème curieux sur, contrôles inaccessibles ou presque
    Par Arno_94 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 07/12/2009, 12h21
  4. [XL-2003] VBA excel problème sur contrôle statusbar
    Par wolop dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/08/2009, 15h07
  5. Evénement "click" sur contrôle ImageButton
    Par Nixar dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/12/2007, 22h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo