2009-03-29 4 views
3

Ich lade einen LinkButton dynamisch, wenn ein Benutzer auf einen anderen LinkButton klickt. Ich füge einen Event-Handler an ihn an. Wenn der Benutzer auf den dynamisch geladenen LinkButton klickt, wird das Ereignis nicht ausgelöst.Dynamisch geladenes Steuerelement - wie kann ich auf einen Wert in Page_Init zugreifen

Von dem, was ich gelesen habe, verstehe ich, ist dies, weil wenn die Seite zurückgibt das dynamisch geladene Steuerelement nicht mehr existiert. Es sieht so aus, als müsste ich sicherstellen, dass dieses Steuerelement in Page_Init neu erstellt wird.

Der dynamisch erstellte LinkButton ist abhängig von einem Wert (Product ID). Ich brauche einen Weg, um auf diesen Wert zuzugreifen, damit ich das Steuerelement richtig erstellen kann. ViewState ist nicht zugänglich und ich bin besorgt, wenn ich Session verwenden könnte, könnte es Zeitüberschreitung und dann würde das nicht helfen. Irgendwelche Ideen?

Außerdem habe ich einen Produkt-ID-Wert nur für Testzwecke fest programmiert, und das Ereignis wurde trotzdem nicht ausgelöst. Gibt es noch etwas, was ich tun muss?

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

SetTabText SetActionLinks nennt, die die Linkbutton erstellt:

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(); 
    } 
} 

Antwort

0

Blick auf anonyme Delegaten

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

Ich änderte meine Ereignisse zu anonymen Delegierten, aber es scheint nichts geändert zu haben ... –

2

In Ihrem Szenario, das ich Ihren Code versucht, verursacht die folgende Zeile Ihrer Veranstaltung Brennen Fehler:

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

versuche, eine ID zu setzen, die sich nicht zwischen Postbacks ändert.

Für ViewState können Sie Ihren Code nach Page_Load verschieben. Ihr Code funktioniert gleich, aber Sie können Zugang Viewstate und Ihre Control Gebuchte Werte

+0

Also muss die ID die gleiche bleiben, die ich sehe. Ich änderte es, um die Namensgebung konsistent zu machen, aber das hat funktioniert. –

5

Sie können Ihre Product ID in einem versteckten Feld setzen und seinen Wert in Page_Init erhalten mit

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

Auf diese Weise brauchen Sie nicht ich schlage vor, Sie lesen sehr this greate arcticle series

+0

+1 Große Lesung Ender, danke für den Link, es ist, was ich gesucht habe ... –

0

Haben Sie AutoEventWireup="true" in Ihrer ASPX-Datei auf Viewstate oder Session

auch für dynamische Steuerelemente verlassen?

1

Ich verbrachte eine schlaflose Nacht herauszufinden, etwas vor ein paar Monaten. Das war der Punkt, an dem ich die Tatsache, dass ASP.NET auf einer zustandslosen Grundlage aufbaut und den Status durch Ping-Ponging-Viewstate zwischen dem Client und dem Server aufrecht erhält.

Wenn Sie Steuerelemente dynamisch hinzufügen und löschen oder vorhandene Steuerelemente als Antwort auf die Ereignisauslösung eines dynamisch erstellten Steuerelements ändern, muss das PageInit des übergeordneten Elements die untergeordneten Steuerelemente in dem Zustand wiederherstellen, in dem sie zum Zeitpunkt des Ereignisses vorhanden waren. bevor die Aktionen des Ereignisses angewendet werden). Es mag redundant erscheinen, aber es ist notwendig, um sicherzustellen, dass der Empfänger existiert und sein Handler kann aufgerufen werden, wenn der Server das Ereignis auslösen möchte. Dann kann der Ereignishandler des Steuerelements die Änderungen übernehmen (und Steuerelemente hinzufügen oder entfernen, verschiedene IDs zuweisen usw.)

Ich fand diese Seite im ASP.NET-Ereignislebenszyklus (http://msdn.microsoft.com/en-us/library/ms178472.aspx) hilfreich.

1

arbeitet Dies Page_Init

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

Die Hidden werden die Kontrollen speichern geladen werden (Rohrtrennzeichen) und die wir die Steuerelemente dynamisch geladen werden können.

Verwandte Themen