CUSTOM CONTROL gérer les events de boutons dynamiques [Résolu]

Signaler
Messages postés
2
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
1 février 2008
-
jpdruet
Messages postés
2
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
1 février 2008
-
Bonjour à toutes et à tous,

Je sais bien qu'il faut éviter au maximun d'utiser les Web Custom Control sans être un expert surle cycle de vie d'une page ASP.NET (Un grand respect en passant pour tes compétences) mais comme il faut bien progresser, je vais quand même tenter ma chance... Voici donc quel est mon problème:

Grosso modo, j'ai crée un Web Custom Control qui permet d’afficher une liste de données à partir d’une simple recherche….<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>J’arrive à intercepter l’event de mon bouton "chercher" puisque celui si est crée dans le createchildcontrols() qui est overrridé.
Le problème n'est à priori pas là.
Cependant lorsqu’il s’agit de récupérer l'event sur les boutons d’une des lignes de données issu de la recherche, rien ne se passe…

J'avoue humblement sécher sur ce problème (bon ok cela ne fait que 2 petits jours que je cherche et je n'ai pas encore regardé le sacro saint cycle de vie de ASP.NET) meacoulpa...

Voici un petit bout de code qui ne fonctionne pas mais qui devrait vous éclairez quant à mon problème.
Et encore merci pour votre aide...

publicclassTEST: WebControl,INamingContainer
{
   protectedoverridevoid CreateChildControls()
   {
      oTable = newTable();
      InitTblSearch(oTable, TableName);
      this.Controls.Add(oTable);

      //base.CreateChildControls();
   }
   protectedoverridevoid OnPreRender(EventArgs e)
   {
      base.OnPreRender(e);
      // CODE POUR AJOUTER DES SCRIPTS ET DES STYLES DANS LE HEAD DE LA PAGE
   }
   protectedoverridevoid Render(HtmlTextWriter output)
   {
      EnsureChildControls();
      oTable.RenderControl(output);
   }
   void InitTblSearch(Table oTable, string sTableName)
   {
      TableRow oRowSearch = newTableRow();
      oRowSearch.Cells.Add(newTableCell());
      TextBox oTexte = newTextBox();
      oCellSearch.Controls.Add(oTexte);
      Button oBtnAction = newButton();
      oBtnAction.Click += newEventHandler(oBtnSearch_Click);
      oCellSearch.Controls.Add(oBtnAction);
      oRowSearch.Cells.Add(oCellSearch);
      oTable.Rows.Add(oRowSearch);
   }
   void oBtnSearch_Click(object sender, EventArgs e)
   {      // AFFICHAGE DES DONNEES EN FONCTION DU CRITERE DE RECHERCHE SAISI DANS <?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /??><st1:personname productid="LA ZONE DE TEXTE" w:st="on"><st1:personname productid="LA ZONE DE" w:st="on">LA ZONE DE</st1:personname> TEXTE
</st1:personname>      DataTable dtTable = // RECUPERER LES DONNEES;
      foreach (DataRow dtRow in dtTable.Rows)
      {
         TableRow oRow = newTableRow();
         TableCell oCellAction = newTableCell();
         Button oBtnAction = newButton();
         oBtnAction.Click += newEventHandler(oBtnAction_Click);
         oCellAction.Controls.Add(oBtnAction);
         oRow.Cells.Add(oCellAction);
         oTable.Rows.Add(oRow);
      }
   }     
   void oBtnAction_Click(object sender, EventArgs e)
   {      
      Button oBtnAction = (Button)sender;
      // ACTION A MENER SUR <st1:personname productid="LA LIGNE SELECTIONNEE" w:st="on">LA LIGNE SELECTIONNEE
</st1:personname>   }
}





}

2 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
18
Bonsoir,

lors du 3ème passage, recréé tu toutes les lignes résultat ? Car là :

1. OK tu construit un bouton
2. tu click sur le bouton
 ==> tu recrées le button puis lors de l'event btn_click  (RaisePostBackEvent) tu crées tes nouvelles lignes
3. tu click sur le boutton d'une ligne 
==> tu recrées le bouton, puis  ASP.net va chercher le btn sur lequel tu as clické (via Request.Form["__EVENTTARGET"]) mais ne le trouve pas puisque tu l'as pas reconstruit. Il faut donc reconstruire les lignes à ce niveau ou au plus tard lors du load.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
Messages postés
2
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
1 février 2008

Bonjour Cyril,

Merci de ta réponse... J'en étais arrivé à la même conclusion mais comme je lisais cet excellent article:
http://www.dotnetguru.org/articles/aspnet/events/EventASPNET1.htm
Je n'avais pas encore pris le temps de répondre à mon premier post...

Effectivement, tout doit se faire dans le createchidControls() ou le init de mon webcustomcontrol...
Donc dans l'event oBtnSearch_click:

void oBtnSearch_Click(object sender, EventArgs e)
{
   IsSearch = true;
   CreateChildControls();
}

protected overridevoid
 CreateChildControls()
   {
      oTable = newTable();
      InitTblSearch();
      if(IsSearch)
      {
         InitTblCorps();
      }      this.Controls.Add(oTable);<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

   }

Remarque:
j'ai quand même été confronté à des registereventvalidation invalide ou des viewstate décalés sur des click répéter de mon bouton de recherche...
Du coup, je stocke les valeurs de recherche et je clear tous les controls avant de recontruire le tableau....
De la grosse bricole quoi, je poursuis donc mes efforts pour essayer de faire quelques choses de propres...

A suivre donc....