2009-03-29 5 views
3

Je charge dynamiquement un LinkButton lorsqu'un utilisateur clique sur un autre LinkButton. J'attache un gestionnaire d'événement à celui-ci. Lorsque l'utilisateur clique sur le LinkButton chargé dynamiquement, l'événement ne se déclenche pas. D'après ce que j'ai lu, je comprends que c'est parce que quand la page affiche en arrière le contrôle chargé dynamiquement n'existe plus. Il semble que je suis censé m'assurer que ce contrôle est recréé dans Page_Init.Contrôle dynamiquement chargé - comment puis-je accéder à une valeur dans Page_Init

Le LinkButton créé dynamiquement dépend d'une valeur (Product ID). J'ai besoin d'accéder à cette valeur pour pouvoir créer le contrôle correctement. ViewState n'est pas accessible et je suis inquiet si j'utilise Session, il pourrait expirer et cela n'aiderait pas. Des idées?

En outre, j'ai codé en dur une valeur d'ID de produit juste pour le test, et cela n'a toujours pas déclenché l'événement. Y a-t-il autre chose que je dois faire?

protected void Page_Init(object sender, EventArgs e) 
{ 
    SetTabText(1, 1); 
} 

SetTabText appelle SetActionLinks qui crée le LinkButton:

protected Panel SetActionLinks(int prodID, int tabID) { 
... 
LinkButton lnkBtn = new LinkButton(); 
lnkBtn.ID = "lnkBtn" + rand.Next().ToString(); 
lnkBtn.CommandName = "action"; 
lnkBtn.Command += new CommandEventHandler(this.lnkAction_Command); 
panel.Controls.Add(lnkBtn); 
... 
} 
void lnkAction_Command(object sender, CommandEventArgs e) 
{ 
    LinkButton btn = (LinkButton)sender; 
    switch (btn.CommandArgument) 
    { 
     AddCart(); 
    } 
} 

Répondre

0

Regardez les délégués anonymes

LinkButton lb = new LinkButton(); 
lb.Command += delegate { // do something here. also you can access any variable from current stack }; 
+0

J'ai changé mes événements en délégués anonymes, mais cela ne semble pas avoir changé quelque chose ... –

2

Dans votre scénario, j'ai essayé votre code, la ligne fait ci-dessous votre faute de tir de l'événement:

lnkBtn.ID = "lnkBtn" + rand.Next().ToString(); 

essayez de définir un ID qui ne change pas entre les publications. Pour ViewState, vous pouvez déplacer votre code vers Page_Load.

Votre code fonctionne même, mais vous pouvez accéder ViewState et votre valeur POSTée de contrôle

+0

Donc l'ID doit rester le même que je vois. Je l'ai changé pour avoir la dénomination cohérente, mais cela a fonctionné. –

5

Vous pouvez mettre votre ID de produit dans un champ caché et obtenir sa valeur en Page_Init utilisant

Page.Request(Page.FindControl("hdnPageIdField")) 

De cette façon, vous n'avez pas besoin compter sur ViewState ou SessionState

également pour les contrôles dynamiques, je vous suggère fortement de lire this greate arcticle series

+0

+1 Bonne lecture Ender, merci pour ce lien, c'est ce que je cherchais ... –

0

Avez-vous AutoEventWireup="true" dans votre fichier .aspx?

1

J'ai passé une nuit blanche à trouver quelque chose comme ça il y a quelques mois. C'est à ce moment-là que j'ai pleinement compris le fait qu'ASP.NET est construit sur une base sans état et qu'il maintient l'état en faisant un ping-ponging entre viewstate et le client. Si vous ajoutez et supprimez dynamiquement des contrôles ou modifiez des contrôles existants en réponse à un déclenchement d'événement d'un contrôle créé dynamiquement, PageInit de l'élément parent doit recréer les contrôles enfants dans l'état où ils existaient au moment du déclenchement de l'événement (avant que les actions de l'événement ne soient appliquées). Cela peut sembler redondant, mais c'est nécessaire pour s'assurer que le récepteur existe et que son gestionnaire peut être appelé lorsque le serveur veut déclencher l'événement. Ensuite, le gestionnaire d'événements du contrôle pourra appliquer les modifications (et ajouter ou supprimer des contrôles, assigner des ID différents etc.)

J'ai trouvé cette page sur le cycle de vie des événements ASP.NET (http://msdn.microsoft.com/en-us/library/ms178472.aspx) utile.

1

Cela fonctionne dans Page_Init

HiddenField ctrl = (HiddenField)Page.FindControl("hfTest"); 
string strValue = Page.Request.Form.Get(ctrl.ClientID); 

Le HiddenField enregistre les commandes à charger (tuyau Délimité) et nous pouvons charger les commandes dynamiquement.