2009-05-12 17 views
2

Ich füge ein LinkButton-Steuerelement dynamisch in einen PlaceHolder ein. Wenn ich eine neue Instanz des LinkButton auf jedem OnInit() hinzufüge, funktioniert OnClick-Handler für dieses LinkButton.ASP.NET Dynamisch hinzugefügt LinkButton - OnClick-Handler wird nicht aufgerufen

Wenn ich jedoch die Instanz von LinkButton in der Sitzung speichern und dann in der Sammlung von Steuerelementen des PlaceHolder hinzufügen, schlägt LinkButton.OnClick fehl.

Gibt es eine Möglichkeit zur Wiederverwendung von Steuerelementen, die ich in der Sitzung in einem bestimmten Szenario speichern? Sie jedes Mal neu zu erstellen, ist kaum eine Option.

Nur als eine Randnotiz - es ist eine geerbte Anwendung in 1.1, die ich gerade auf 3.5 migriert. Der "gebrochene" Ansatz schien in 1.1 zu funktionieren.

Danke für alle Antworten.

public static void Clicked(object sender, EventArgs e) { 
    Debugger.Break(); 
} 

protected override void OnPreInit(EventArgs e) { 
    base.OnPreInit(e); 
    InitLinkButton(); 
} 

private void InitLinkButton() {  
    var lb = new LinkButton(); 
    plOne.Controls.Add(lb); 
    lb.ID = "lb"; 
    lb.Text = "I will work."; 
    lb.Click += Clicked; 
    plOne.Controls.Add(lb); 

    LinkButton lb2 = null; 
    if (Session["lb2"] == null) { 
     lb2 = new LinkButton(); 
     lb2.ID = "lb2"; 
     lb2.Text = "I won't work."; 
     lb2.Click += Clicked; 
     Session["lb2"] = lb2; 
    } else { 
     lb2 = (LinkButton)Session["lb2"]; 
    } 
    plOne.Controls.Add(lb2); 
} 

Antwort

10

Paar Dinge:

1) Nie, nie, nie speichern eine Instanz eines WebControl zu Session. Jedes WebControl hat einen Verweis auf das Page-Objekt, das natürlich auf jedes andere WebControl verweist. Sobald Sie ein WebControl in Session speichern, speichern Sie grundsätzlich die gesamte Seite und alles, was sie enthält. Sie sind auf der Autobahn zur Speicherleckstadt.

2) Jedes Steuerelement wird bei jedem Postback neu erstellt. Ich denke, Sie denken vielleicht, dass das erneute Erstellen Ihrer LinkButtons jedes Mal langsam ist, aber es ist nicht wahr.

3) Warum erstellen Ihre dynamischen Steuerelemente beim Postback keine Option? Das sollten Sie mit dynamischen Steuerelementen tun. Die Idee dahinter ist, dass Sie die Seite so einrichten, wie sie war, so dass ViewState automatisch an Ihre Steuerelemente angeschlossen werden kann, basierend auf deren IDs. Wenn Sie versuchen, Ihrer Seite dynamisch nach Init() Steuerelemente hinzuzufügen, können Sie ViewState nicht für die Verarbeitung Ihrer Steuerdaten verwenden und müssen Ihren eigenen Mechanismus implementieren.

Meine Empfehlung ist, Ihre dynamischen Steuerelemente in Init() neu zu erstellen - das ist die beste Vorgehensweise.

+1

Die Steuerelemente in Ihrem ASPX werden bei jedem Postback neu erstellt. Dynamische Steuerelemente _müssen_ für jedes Postback neu erstellt werden. –

1

Es ist wirklich eine schreckliche Idee, die Linkbutton in der Sitzung zu speichern. Ich kann mir die Probleme nicht vorstellen. Zumindest hat der LinkButton eine Referenz (über den Clicked-Handler) zur Seite - die eigentlich nicht mehr existieren sollte (die Seite wurde gerendert und an den Client gesendet). Aber die Referenz würde es am Leben erhalten, so dass es nicht GC'ed sein wird.

Dass gesagt wird, ist es möglich , die Sie gerade angeklickten Handler neu verkabeln müssen:

if (Session["lb2"] == null) { 
    /* ... */ 
} else { 
    lb2 = (LinkButton)Session["lb2"]; 
    lb2.Click += Clicked; 
} 

Da das LinkButton.Click Ereignis verdrahtet ist eine andere Instanz der Page-Klasse (die, die wurde vorher benutzt), es hätte keinen sichtbaren Effekt (da diese Seite bereits gerendert wurde). Natürlich, wie ich oben sagte, ist das nur völlige Verrücktheit - also habe ich das nicht getestet.

Wenn Sie dies verwenden, sollten Sie sich auch bei Page_PreRender austragen, um das GC-Problem zu vermeiden.

Und das Erstellen der Kontrolle ist wieder der normale Weg, um dies zu tun - und es ist eine praktikable Option für alle anderen, so dass Sie die Komplikationen darin überdenken können.

3

Um Ihre Frage zu beantworten, wie OnClick funktioniert, müssen Sie das Ereignis mit der Methode verbinden;

Ich kann nur nicht sehen, Sie Problem mit der Wiederherstellung der Kontrolle auf init, nicht zu kompliziert Dinge! Es wurde genug über das gesagt, was Sie in Ihrer Sitzung speichern, also werde ich keine andere Antwort veröffentlichen, die dieses Problem behebt.

Verwandte Themen