web-dev-qa-db-fra.com

Existe-t-il un événement after▶Load dans ASP.net

Y a-t-il un événement qui est déclenché après que tousPage_Load Événements se soient terminés?

Comment puis-je avoir plus d'un Page_Load?
Lorsque vous disposez de commandes utilisateur.

Avant que ma page puisse s'afficher, j'ai besoin que ma page (et tous les contrôles intégrés) se soient initialisés en complétant leurs événements Page_Load.

Le problème, bien sûr, est que si je mets du code dans le gestionnaire Page_Load De ma page:

MyPage.aspx
   --> Page_Load
          ---> DoSomethingWithUserControl()
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored

puis je commence à accéder à mon contrôle UserControl1 avant qu'il ne soit prêt.

j'ai besoin d'un moyen d'exécuter du code après tous les événements Page_Load se sont déclenchés, mais avant tous les événements de publication (par exemple, les événements Click) se sont déclenchés:

MyPage.aspx
   --> Page_Load
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored
MyPage.aspx
   --> Page_AfterLoad
          ---> DoSomethingWithUserControl()

En regardant le cycle de vie des pages dans MSDN, il semble qu'il n'y ait aucun moyen de déclencher un événement après tous les lieux

enter image description here

Existe-t-il un moyen de déclencher un after après tous les ChargesPubliées sont terminées?

36
Ian Boyd

Page_LoadComplete est l'événement qui est déclenché après le chargement de tous les contrôles

N'oubliez pas que l'événement Init est d'abord déclenché par tous les contrôles enfants, et juste au moment où tous les contrôles ont été initialisés, l'événement Init de la page est déclenché. L'événement Load fonctionne dans l'autre sens, la page déclenche d'abord l'événement Load, puis chaque contrôle enfant déclenche son propre événement Load. À la fin, le LoadComplete est levé. Notez que cela n'est vrai que lorsque les contrôles sont créés au moment du design , lorsque les contrôles sont créés dynamiquement, ils (malheureusement) ne suivent pas strictement cette approche.

Depuis MSDN:

Si les contrôles sont créés dynamiquement au moment de l'exécution ou de manière déclarative dans des modèles de contrôles liés aux données, leurs événements ne sont initialement pas synchronisés avec ceux des autres contrôles de la page. Par exemple, pour un contrôle ajouté au moment de l'exécution, les événements Init et Load peuvent se produire beaucoup plus tard dans le cycle de vie de la page que les mêmes événements pour contrôles créés de façon déclarative. Par conséquent, à partir du moment où ils sont instanciés, les contrôles ajoutés dynamiquement et les contrôles dans les modèles déclenchent leurs événements les uns après les autres jusqu'à ce qu'ils aient rattrapé l'événement au cours duquel il a été ajouté à la collection Controls.

Regarde:

(source: http://msdn.Microsoft.com/en-us/library/ms178472.aspx )

enter image description here

Modifier 1

Afin de répondre à toutes vos exigences:

j'ai besoin d'un moyen d'exécuter du code après le déclenchement de tous les événements▶Load, mais avant le déclenchement des événements de publication (par exemple, les événements Click)

Je pense que le moyen le plus simple est de déclarer un événement personnalisé dans le contrôle utilisateur et de le déclencher après le chargement du contrôle, puis de vous abonner à cet événement dans votre ASPX

Contrôle utilisateur

    public event Action LoadCompleted = delegate { };

    protected void Page_Load(object sender, EventArgs e)
    {
        this.LoadCompleted();
    }

Page ASPX

    protected void Page_Load(object sender, EventArgs e)
    {
        this.myUserControl.LoadCompleted += () => 
        {
            // do somethign interesting
            this.lblMessage.Text = DateTime.Now.ToString();
        };
    }
61
Jupaol

Il semble qu'il n'y ait vraiment aucun moyen de faire exécuter votre code de manière fiable entre le moment où tous les contrôles (déclarés statiquement, voir les commentaires de Jupaols sur l'ajout dynamique) sont chargés et le moment où leurs événements de publication sont déclenchés.

Je suis même allé jusqu'à démonter la classe Page à l'aide d'un réflecteur et pour autant que je sache, la page n'appelle aucune méthode que vous pourriez utiliser entre ces moments.

Donc, pour le cas général, il semble que vous n'ayez pas de chance.

Mais votre déclaration

puis je commence à accéder à mon contrôle UserControl1 avant qu'il ne soit prêt

est discutable. Au moment où le Page_Load est appelée, l'état d'affichage et l'état de contrôle ont été définis sur tous les contrôles (au moins ceux déclarés statiquement). Donc, à moins que vous n'ayez plus d'initialisation d'état dans la méthode OnLoad d'un contrôle, le contrôle est prêt à être bricolé. Si vous avez quelque chose en cours dans OnLoad, alors pourquoi ne pas y bricoler?

1
user1429080