Comment puis-je déplacer des contrôles dans un contrôle utilisateur ajouté dynamiquement dans une page?

StackOverflow https://stackoverflow.com/questions/620684

Question

J'ai un contrôle utilisateur qui déplace dynamiquement sur la méthode CreateChildControls certains contrôles Web. Lorsque vous utilisez ce contrôle dans une page telle que:

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

Cela fonctionne parfaitement.

Mais si je veux ajouter userControl dynamiquement dans une page telle que:

<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 mon CreateChildControls avec l'erreur suivante: la collection de contrôles ne peut pas être modifiée pendant les phases DataBind, Init, Load, PreRender ou Unload.

La ligne exacte correspond au moment où j'ajoute WebControls à l'espace réservé dans UserControl:

plhContent.Controls.Add(myWebControl);

Je ne comprends donc pas pourquoi, dans ce cas, je ne peux pas déplacer un contrôle Web à l'intérieur de l'événement CreateChildControls lorsque j'ajoute mon contrôle UserControl de manière dynamique.

Était-ce utile?

La solution

Etant donné que LoadControl rattache chaque événement du contrôle chargé à l'événement actuel, il est impossible d'exécuter CreateChildControls en même temps que le parent car l'événement s'est déjà produit à ce moment-là.

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

Autres conseils

Les contrôles doivent être initialisés et mis au courant avec le reste des contrôles jusqu'au "cycle de vie des pages". est concerné. Examinez 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 postback à partir de la page. N'oubliez pas que vous devrez ré-ajouter votre contrôle au formulaire pour chaque publication, car il ne sera pas créé pour vous

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top