2009-09-05 6 views
8

Cela me rend fou.Contrôle utilisateur ASP.NET: Page_Load déclenche avant que la propriété ne soit définie

J'ai un contrôle utilisateur très simple:

public int? ImageId {set; get;} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... do something with ImageId... 
} 

Et puis je mets ce contrôle sur la page avec ListView dans les UpdatePanel:

<asp:ListView ID="ListViewImages" runat="server" DataSourceID="src"> 
    <LayoutTemplate> 
    <asp:PlaceHolder ID="itemPlaceholder" runat="server" /> 
    </LayoutTemplate> 
    <ItemTemplate> 
    <My:MyControl ImageId='<%# Eval("Id") %>' ID="cipPreview" runat="server" /> 
    </ItemTemplate> 
</asp:ListView> 

Le problème est les feux de Page_Load AVANT ensembles ASP.NET ImageId. Avec l'aide du débogueur, j'ai découvert que pour une raison quelconque ImageId dans MyControl EST SET, mais cela arrive seulement après que Page_Load a terminé le traitement. Qu'est-ce qui ne va pas?

Répondre

9

C'est probablement parce que la liaison de données sur ListView se produit après les incendies de Page_Load, donc votre propriété n'est pas définie à ce moment-là. Vous pouvez déplacer votre code vers l'événement PreRender car il est appelé une fois la liaison de données terminée.

Plus d'informations selon MSDN:

PreRender - Avant cet événement se produit:

  • L'objet Page appelle EnsureChildControls pour chaque contrôle et pour la page.
  • Chaque contrôle lié aux données dont la propriété DataSourceID est définie appelle sa méthode DataBind.
+0

Merci. PreRender fonctionne pour moi. –

Questions connexes