Problème __doPostBack sur un composant perso

Résolu
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007 - 6 août 2007 à 16:48
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007 - 8 août 2007 à 17:46
Bonjour,

j'ai créé un composant qui hérite de LinkButton.

J'ai surchargé l'evenement OnClick:

protected
override
void OnClick(
EventArgs e)
{

   base.OnClick(e);
   
if (!
string.IsNullOrEmpty(Page.Request.Params[
"__EVENTTARGET"]) && Page.Request.Params[
"__EVENTTARGET"] == ClientID)
   {

      EventHandler handler1 = (
EventHandler)
base.Events[
"Click"];

      if (handler1 !=
null)
      {   
         handler1(
this, e);
      }

      string sScript =
"<script language=javascript>LaunchSelection_RABSelecteur_" + ClientID +
"('" + Title +
"','" + ClientID +
"','" + Filtre +
"');</script>";

      if (!Page.IsClientScriptBlockRegistered(
"Click_" + ClientID))
      {   
         Page.RegisterStartupScript(
"Click_" + ClientID, sScript);
      }
   }
}

Dans le render, j'ajoute une textbox et un lien.
Le lien permet de lancer le retour coté serveur
output.Write(

" + Page.ClientScript.GetPostBackClientHyperlink(
this,
"OnClick") +
"">");

Le problème, c'est que lorsque j'utilise mon composant dans la meme page qu'un autre composant qui fait un __doPostBack, l'evenement de l'autre composant est capturé par le mien. Ou pire, si je met deux fois mon composant dans la meme page, il rentre systématiquement dans le dernier.

Avez vous une idée d'où peux venir mon problème ? merci d'avance

15 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
6 août 2007 à 21:09
bonsoir,

eryver ce que tu essayes de faire est extremement sale :-) ce n'est pas comme ca qu'il faut faire ! La solution apporté par yann_lo_san est déjà beaucoup plus propre mais à quoi bon recoder un linkbutton ?

Le plus simple pour toi est d'hériter de linkbutton et dans le constructeur de ton controle tu t'abonnes à ton évenement click ce qui t'évites de tester les champs __EventTarget & co (laisse ASP.net faire son boulot, au lieu de rajouter des bugs ;))

Ensuite si tu veux rajouter des controles dans ton linkbutton (ce que je te déconseille) il faut implémenter l'interface INamingContainer et rajouter tes controles dans la méthode (surchargé) CreateChildControls (this.Controls.Add(monButton);) tu auras beaucoup moins de problème ...
Mais cette solution pose un problème puisque tu rajouteras tes controles dans une balise Cyril - MSP - MCPD ASP.net & MCTS SQL
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 août 2007 à 19:42
Salut,

Je déplace sur ASPFr, ce problème n'est pas directement lié au langage C#, donc ils seront probablement plus efficaces que nous ;-)

/*
coq
MVP Visual C#
CoqBlog
*/
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
6 août 2007 à 20:36
Voici une autre façon de faire :

public class MyLinkButton : Control, IPostBackEventHandler
{
            public event EventHandler Click;
            protected virtual void OnClick(EventArgs e) 
            {
                  if (Click != null) {
                        Click(this, e);
                  }    
            }
            
            public void RaisePostBackEvent(string eventArgument)
            {
                  OnClick(new EventArgs());
            }

            protected override void Render(HtmlTextWriter output) 
            {
                  output.Write("");
                  output.Write(" " + this.UniqueID + "");
            }
}  
0
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007
7 août 2007 à 11:15
Re ^^

Je tiens a préciser quand meme qu'il s'agit d'une migration de C# 1.0 vers 2.0 d'un composant fait par un ancien collègue.
En 1.0 tout fonctionnait bien mais depuis le 2.0, dès qu'un __doPostBack est executer dans la page, on rentre systématiquement dans la méthode RaisePostBackEvent(string eventArgument) du derniere controle "perso".

J'ai essayé la technique de yann_lo_san (qui est plus propre en effet, merci :)  ) mais voila j'obtient le meme resultat.
J'ai enlevé l'heritage de LinkButton pour hériter de UserControl mais bon... pas mieux.

Tout fonctionne bien mis a par le fait que tout les evenements __doPostBack ne sont pas envoyés vers le bon control. Je ne comprend pas comment c'est possible. Quand que regarde Page.Request.Params["__EVENTTARGET"]) , c'est bien le controle sur le quel j'ai clické qui est dedans et pourtant il ne me dirige pas sur ce controle !

Merci encore d'essayer de m'aider
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007
7 août 2007 à 11:45
J'ai essayé de faire comme jesusonline m'a dis.
J'ai enlevé tout le code Click, RaisePostBackEvent ... j'ai juste hérité de link bouton, et dans le constructeur, je me suis abonné a l'evenement click.

Et j'obtient exactement le meme résultat qu'avant.

Systematiquement si je submit ma page ou que je clic sur un bouton avec retour serveur, il rentre dans le click de mon controle "selecteur". C'est quand meme bizzare comme truc
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
7 août 2007 à 11:49
hériter de UserControl ne sert à rien si le controle n'est pas lié à un fichier .ascx :p

Peux tu nous montrer le code de ton controle que tu as maintenant ?

et une page toute simple qui illustre le problème. Car là si tu fais un compositecontrol, c'est ASP.net qui gère les evenements, toi tu ne fais que t'abonner à ces événéments et il n'y a pas de raisons que ASP.net s'emmelle les pinceaux.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 août 2007 à 19:34
Je le savais, c'était juste pour voir si toi aussi !
Comment ça pas crédible ? :p

/*
coq
MVP Visual C#
CoqBlog
*/
0
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007
8 août 2007 à 12:32
Merci beaucoup.
J'ai modifié mon controle pour en faire un controle composite et tout fonctionne super.

Bon l'impacte le code metier du controle est assez important mais bon ... au moins ca fonctionne.

J'ai donc 
   -   fait hérité mon controle de CompositeControl 
   - Ajouté mes composant textbox et bouton dans la methodé override CreateChildControls() a l'aide de this.Controls.Add(textbox);
   - Dans mon constructeur, je me suis abonné a l'évenement Click de mon bouton pour lancer mon propre evenement OnClick(newEventArgs());

Et voila tout fonctionne :)

Merci beaucoup
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 août 2007 à 12:48
héhé :) quand on fait les choses proprement ca marche tout de sutie beaucoup mieux ;-)

par contre pourquoi faire un new EventArgs() ? pourquoi ne pas lui passer l'eventArgs que tu obtiens via le click du bouton ?

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL
0
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007
8 août 2007 à 15:53
Pour utiliser ca :



public



event



EventHandler
Click
{


   add

         {
            Events.AddHandler(

"Click"
,

value
);
         }


   remove

         {
            Events.RemoveHandler(

"Click"
,

value
);
         }
  }

Ce qui permet ensuite plus loin dans le code, de faire ou non un retour coté serveur en fonction du fait qu'une page est abonné ou non a l'évenement clic du controle.

Je sais pas si il y a moyen de faire autrement, j'ai réutilisé ce qui était déjà fait dans le controle

Voila :)

En tout cas, merci beaucoup pour votre aide
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 août 2007 à 15:59
oui d'accord mais pourquoi faire un new EventArgs ? puisque lorsque tu t'abonnes au click sur le bouton tu en as déjà un.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL
0
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007
8 août 2007 à 16:30
Oups, j'avais pas fait attention ^^
Merci.

J'en profite pour reposer une question.
Comment je peux faire pour que coté client en faisant un getElementById('idDeMonControle').value, je recupere la valeur de ma textbox ?
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 août 2007 à 16:33
document.getElementById('<%=ctrl.ClientID%>').value devrait fonctionner.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL
0
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007
8 août 2007 à 17:17
Merci mais je ne peux pas changer le code coté client. Le composant est utilisé par plein de page, il faut donc qu'il réagisse comme avant.

Les pages actuelles utilise des getElementById('idDeMonControle').value.

Il faudrait donc que mon controle retourne la valeur de ma textbox lorsque l'on fait ca.
Est ce possible ?
0
eryver Messages postés 12 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 octobre 2007
8 août 2007 à 17:46
Bon j'ai tout simplement mis dans le render this.Attributes["value"] = textbox.Text; et voila maintenant tout fonctionne.

Vraiment un grand merci, je ne m'en serai pas sorti tout seul.
0
Rejoignez-nous