2009-03-06 5 views
2

J'ai un usercontrol qui déplace dynamiquement sur la méthode CreateChildControls certains contrôles web. Lorsque vous utilisez cette commande dans une page comme:Comment puis-je déplacer des contrôles dans un contrôle utilisateur ajouté dynamiquement dans la page?

<myControls:MyUserControl runat="server" ID="myUserControl" /> 

Il fonctionne parfaitement.

Mais si je veux ajouter que UserControl dynamiquement dans une page comme:

<asp:UpdatePanel runat="server"> 
    <ContentTemplate> 
     <asp:PlaceHolder runat="server" ID="plhControls" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 
<asp:Button runat="server" ID="btnAdd" OnClick="btnAdd_Click" /> 

.cs

protected void btnAdd_Click(object sender, EventArgs e) 
{ 
    MyUserControl myUserControl =(MyUserControl)LoadControl("~/Controls/MyUserControl.ascx"); 
    myUserControl.ID = "test"; 
    plhControls.Controls.Add(myUserControl); 
} 

Il se bloque dans mes CreateChildControls avec l'erreur: La collection de contrôle ne peut pas être modifié pendant DataBind , Init, Load, PreRender ou Décharger les phases.

La ligne exacte est quand ajouter les WebControls à l'espace réservé à l'intérieur de mon UserControl:

plhContent.Controls.Add(myWebControl); 

Je ne comprends pas pourquoi, dans ce cas, je ne peux pas bouger un contrôle web dans l'événement CreateChildControls quand j'ajoute mon UserControl dynamiquement.

Répondre

1

Depuis LoadControl rattraper chaque événement du contrôle chargé à l'événement en cours, il est Impossible d'exécuter CreateChildControls en même temps que le parent puisque l'événement s'est déjà produit à ce moment-là.

Dans mon cas, je ne peux pas ajouter dynamiquement mon UserControl, donc j'ai fait le contraire pour reproduire le même comportement que je voulais. J'initialise tous mes contrôles, et supprime ceux que je ne veux pas OnClick. Cela ajoute un temps de chargement inutile, mais il est acceptable dans le scénario que je l'utilise.

0

Les contrôles doivent être initialisés et mis à jour avec le reste des contrôles en ce qui concerne le "cycle de vie de la page". Jetez un oeil à la méthode Page.LoadControl, et voyez s'il est possible de créer votre contrôle plus tôt.

La méthode que nous utilisons parfois implique l'utilisation d'un paramètre de publication à partir de la page. N'oubliez pas que vous devrez rajouter votre contrôle à la forme pour chaque publication, car il ne sera pas créé pour vous

+0

Malheureusement, je ne peux pas créer mon contrôle plus tôt, à cause d'un précédent mouvement de contrôle. et par conséquent je ne peux pas utiliser les paramètres pour la publication. –

Questions connexes