Ajouter dynamiquement un contrôle utilisateur à un répéteur

J'ai une classe (Maclasse), ce qui représente une hiérarchie, de sorte que la classe a une propriété qui est une collection de MyClass. Maclasse a aussi un titre de propriété

Pour l'afficher sur une page web, j'ai été en espérant pour créer un contrôle utilisateur qui a un répéteur. Dans le modèle d'élément, j'aurais littérale pour afficher le titre de propriété, et sur la ItemCreated cas de la répétition, je voudrais créer une nouvelle instance de l'objet usercontrol, et l'ajouter dans l'élément courant dans le relais.

Mon problème est que, lorsque l'événement Page_Load dans le usercontrol incendies, si le contrôle a été ajouté de manière dynamique, la repMyClass répéteur poroperty est nulle, même si je l'appelle EnsureChildControls. Suis-je manqué quelque chose? Si je créer un répéteur et baisse mon userctonrol dans le modèle d'élément, il fonctionne très bien. Mon ne puis-je pas obtenir que cela fonctionne de façon dynamique?

De Contrôle De L'Utilisateur:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="MyControl" %>
Items:<br/>
<asp:Repeater ID="repMyClass" runat="server" EnableViewState="false" 
    OnItemCreated="repMenuItems_ItemCreated">
    <HeaderTemplate><ul><HeaderTemplate>
    <ItemTemplate>
        <li><%# Eval("Title") %>
            <div><asp:PlaceHolder ID="SubItemPlaceholder" runat="server" /></div>
        </li></ItemTemplate>
    <FooterTemplate></ul></FooterTemplate>
</asp:Repeater>

De Contrôle De L'Utilisateur Code:

public partial class MyControl: System.Web.UI.UserControl
{
    public IEnumerable<MyClass> ChildItems { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        this.repMyClass.DataSource = ChildItems;
        this.repMyClass.DataBind();
    }

    protected void repMenuItems_ItemCreated(object Sender, RepeaterItemEventArgs  e)
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
            //Get the MyClass instance for this repeater item
            MyClass mcCurrent = (MyClass)e.Item.DataItem;

            //If the MyClass instance has child instances
            if (mcCurrent.Children != null && mcCurrent.Children.Length > 0)
            {
                //Add a new user control and set it's property so it can bind
                PlaceHolder ph = (PlaceHolder)e.Item.FindControl("SubItemPlaceholder");

                MyControl ctl = (MyControl)Page.LoadControl(typeof(MyControl),new object[] {});

                ctl.ChildItems = mcCurrent.Children;
                ph.Controls.Add(ctl);
            }
        }
    }
}
Pouvez-vous modifier pour expliquer et peut-être nettoyer cette. Je pense que vous aviez peut-être une demi-modifier dans cette phrase qui n'a pas terminé? "Mon problème est que, lorsque l'événement Page_Load première pour les contrôles qui ont été ajoutées dynamiquement, la repNyClass répéteur poroperty est nul"

OriginalL'auteur Jeremy | 2011-10-05