2012-08-07 1 views
6

Si l'attribut AutoEventWireup est défini sur false, les événements doivent être câblés manuellement. Cependant, je n'arrive pas à tirer le Page_PreInit. Je suppose que je pourrais faire le wireup arriver trop tard (une fois que nous sommes déjà passé Page_PreInit), mais je ne suis pas sûr où d'autre pour mettre les wireups.Câblage de l'événement Page_PreInit manuellement, avec AutoEventWireup défini sur false

Par exemple ...

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e) 
    PreInit += new EventHandler(Page_PreInit); 
    Load += new EventHandler(Page_Load); 
} 

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    Response.Write("Page_PreInit event fired!<br>"); //this is never reached 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("Page_Load event fired!<br>"); 
} 

Les résultats de code ci-dessus en "événement Page_Load tiré!" en cours d'affichage, mais rien de Page_PreInit. J'ai essayé base.OnInit(e) à la fois avant et après les wireups, et cela n'a eu aucun effet.

Le graphique here indique que la méthode OnInit vient effectivement après l'événement PreInit. Dans cet esprit, j'ai essayé de surcharger OnPreInit et de faire la même chose --- aucun effet.

L'article MSDN here dit explicitement que dans le cas de AutoEventWireup ensemble à false, les événements peuvent être câblés dans une OnInit surchargée. L'exemple qu'ils utilisent est Page_Load, et bien sûr cela fonctionne exactement comme il le fait pour moi, mais ils ne traitent pas que cela ne semble pas fonctionner pour l'événement Page_PreInit.

Ma question est: comment puis-je l'événement Page_PreInit câblé dans le cas de AutoEventWireup mis à false?

Je comprends qu'il existe des alternatives énumérées sur le MSDN page, telles que l'utilisation du constructeur de la page. Je voudrais savoir comment faire comme ils suggèrent avec OnInit.

+0

Tu dois le faire dans le constructeur ou avant d'appeler 'base.OnInit'. – Strelok

+0

Malheureusement, mettre les lignes au-dessus de base.OnInit (e) n'a aucun effet, et visant un événement plus tôt (tel que OnPreInit) n'atteindra toujours pas l'événement Page_PreInit. – CptSupermrkt

Répondre

10

L'implémentation de base de la méthode OnPreInit() est responsable de l'événement PreInit. Puisque votre remplacement appelle cette implémentation avant en enregistrant votre gestionnaire PreInit, il ne sera en effet pas appelé.

Essayez d'appeler la méthode classe de base après l'enregistrement du gestionnaire:

protected override void OnPreInit(EventArgs e) 
{ 
    PreInit += new EventHandler(Page_PreInit); 
    Load += new EventHandler(Page_Load); 

    // And only then: 
    base.OnPreInit(e); 
} 
+0

Yup qui l'a fait. Merci. – CptSupermrkt

+0

Il est à noter que ce code surcharge OverPreInit au lieu de OnInit. – Trisped

0

ajouter tout l'événement dans la zone d'initialisation:

public WebName() 
     { 
     this.event+=TAB Key 
     } 
Questions connexes