2009-04-27 8 views
6

Ich lade ein UserControl dynamisch in eine Ansicht, die in einem MultiView-Steuerelement ist. Obwohl das UserControl einen Ereignishandler hinzufügt, wird das Ereignis nie ausgelöst.UserControl Event Handler nicht feuern

Was fehlt mir hier? Danke!

Containing ASPX Seite:

protected override void OnPreRender(EventArgs e) 
{ 
    if (MultiView1.ActiveViewIndex == 2) //If the tab is selected, load control 
    { 
     Control Presenter = LoadControl("Presenter.ascx"); 
     (MultiView1.ActiveViewIndex.Views[2].Controls.Add(Presenter); 
    } 
    base.OnPreRender(e); 
} 

Presenter.ascx.cs

override protected void OnInit(EventArgs e) 
{ 
    Retry.Click += this.Retry_Click; //This is a .Net 2.0 project 
    base.OnInit(e); 
} 


protected void Retry_Click(object sender, EventArgs e) 
{ 
    //This never fires 
} 

Antwort

8

Ich denke, es wird nicht ausgelöst, weil Sie das Steuerelement in Ihrer Seite Prerender-Ereignis laden. Nach dem Zurücksetzen geht das Steuerelement verloren, da es keinen Ansichtszustand für es gibt. Daher gibt es keine Kontrolle, um sein Ereignis auszulösen. Versuchen Sie, das Steuerelement in dem Init-Ereignis der Seite zu laden. Lass uns wissen was passiert!

+0

Das war es. Danke! Ich musste auch die If-Anweisung entfernen, da bei OnPreInit MultiView1.ActiveViewIndex nicht festgelegt ist. –

+0

Sie sind willkommen. –

+0

Vielen Dank! –

1

Es klingt wie die Steuerung nicht hinzugefügt wird nach jedem zweiten Pfosten, ich würde nehmen die if-Anweisung in der aspx-Seite, um zu sehen, ob das das Problem behebt ... ich nehme an, Retry ist eine Schaltfläche?

+0

Ich hatte bereits versucht, die If-Anweisung zu entfernen - kein Unterschied. Ja, Wiederholen ist eine Schaltfläche. –

6

Postback-Ereignisbehandlung erfolgt vor dem Rendern, so dass das Steuerelement in Ihrem Fall nicht auf der Seite vorhanden ist.

Der Lebenszyklus Ereignisse in dieser Reihenfolge gezündet werden (einige übersprungen):

  1. Init
  2. Last
  3. PreRender
  4. Unload

Und Event-Handling erfolgt zwischen Load und PreRender (falls einige Ereignisse die Art ändern, wie die Seite gerendert werden soll, ist es sinnvoll).

Verschieben Sie also einfach Ihren Code, der das Retry-Steuerelement auf Load oder Init lädt.

Referenz: Asp.Net Page Life Cycle Overview

2

Die Steuerung muss zunächst sichtbar sein, um in OnPreRender Ereignis einzugeben. aber vielleicht möchten Sie, dass es nicht sichtbar ist. die sicher zu haben EnableViewState = false;