ASP.NET dynamisch hinzugefügt Linkbutton - OnClick-Handler wird nicht aufgerufen wird

StackOverflow https://stackoverflow.com/questions/855442

  •  21-08-2019
  •  | 
  •  

Frage

Ich füge ein Linkbutton-Steuerelement dynamisch in einen Platzhalter. Wenn ich eine neue Instanz des Linkbutton auf jedem OnInit () hinzufügen, dann OnClick-Handler für diesen Linkbutton funktioniert.

Wenn ich jedoch die Instanz von Linkbutton in der Session speichern und sie dann in Sammlung von Kontrollen des Platzhalters hinzufügen, schlägt LinkButton.OnClick abzufeuern.

Gibt es eine Möglichkeit Kontrollen wieder zu verwenden ich in bestimmtem Szenario in der Sitzung speichern? sie jedes Mal neu zu erstellen ist kaum eine Option.

Nur als Randnotiz - es ist eine vererbte Anwendung in 1.1, die ich auf 3,5 nur migriert. Der 'kaputt' Ansatz schien in 1.1 zu arbeiten.

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);
}
War es hilfreich?

Lösung

Paar Dinge:

1) Nie, nie, nie eine Instanz eines WebControl zu Session speichern. Jeder WebControl hat einen Verweis auf das Page-Objekt - die natürlich Referenzen jeder einzelne andere WebControl. Sobald Sie eine WebControl in Session bunkern, Sie speichern im Grunde die gesamte Seite und alles, was es enthält. Sie sind auf der Autobahn Speicherleck Stadt.

2) Jede Steuerung wird auf jedem Postback neu erstellt. Ich denke, man könnte denken, dass neu erstellen Ihre Linkbuttons jedes Mal langsam, aber es ist nicht wahr.

3) Warum ist neu zu erstellen nicht Ihre dynamischen Steuerelemente auf Postbacks eine Option? Dies ist, was man eigentlich mit dynamischen Kontrollen zu tun. Die ganze Idee ist, dass Sie die Seite einrichten das gleiche, wie es war, so dass automatisch auf ihrem Viewstate-IDs basierend auf Ihre Steuerelemente angeschlossen werden kann. Wenn Sie versuchen, Kontrollen auf Ihrer Seite nach Init () dynamisch überall hinzufügen, werden Sie nicht in der Lage sein, Viewstate zu verwenden, um Ihre Steuerdaten zu handhaben, und müssen Ihre eigenen Mechanismus implementieren.

Meine Empfehlung ist, Ihre dynamische Steuerelemente in Init () neu erstellen -. Dies ist die beste Praxis

Andere Tipps

Um Ihre Frage zu beantworten, wie die OnClick Arbeit zu bekommen, müssen Sie das Ereignis an das Verfahren verbinden;

lb2.Click += new EventHandler(Clicked);

Ich kann einfach nicht sehen Sie Problem mit der Steuerung auf init neu zu erstellen, nicht verkomplizieren Dinge! Genug ist gesagt worden, über das, was Sie in Ihrer Sitzung sind zu speichern, so dass ich nicht eine andere Antwort schreiben diese Frage conserning.

Sie sollten auch die Besuche dynamische Steuerelemente Platzhalter, die viel dazu beitragen wird, der Affen dynamische Kontrollen der Verwaltung ausrechnen

Es ist wirklich eine schreckliche Idee, die Linkbutton in der Sitzung zu speichern. Ich kann nicht einmal die Probleme vorstellen, die dazu führen könnten. Zumindest hat der Linkbutton eine Referenz (mittels des Handlers geklickt haben) auf die Seite - das ist wirklich nicht mehr existieren sollten (die Seite wurde an den Client gemacht und gesendet). Aber die Referenz wäre es am Leben zu halten, damit es nicht GC'ed werden.

Dass gesagt wird, es ist möglich , dass Sie nur den Clicked Handler neu verkabeln müssen:

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

Da das LinkButton.Click Ereignis wird verdrahtet andere Instanz der Page-Klasse (die, die zuvor verwendet wurden), ist es Brennen hätte keinen sichtbar Effekt (seit dass Seite wurde bereits gemacht). Natürlich, wie ich oben gesagt, das ist nur völliger Wahnsinn ist -. So ist es nicht, dass ich das getestet habe wie

Wenn Sie dies tun verwenden, dann sollten Sie auch bei Page_PreRender abmelden oder etwas, um das GC-Problem zu vermeiden.

Und die Kontrolle wieder zu schaffen ist der normale Weg, dies zu tun - und es ist eine praktikable Option für alle anderen, so dass Sie die Komplikationen, dass Grübeln sein

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top