Динамическое добавление пользовательского элемента управления к повторителю

У меня есть класс (MyClass), который представляет вложенную иерархию, поэтому у этого класса есть свойство, которое является коллекцией MyClass. MyClass также имеет свойство title

. Чтобы показать его на веб-странице, я надеялся создать пользовательский элемент управления с повторителем. В шаблоне элемента у меня было бы буквальное отображение свойства title, а в событии ItemCreated ретранслятора я бы создал новый экземпляр пользовательского элемента управления и добавил его в текущий элемент в ретрансляторе.

Моя проблема в том, что при срабатывании события Page_Load в пользовательском элементе управления, если элемент управления был добавлен динамически, свойство репитера repMyClass равно нулю, даже если я вызываю EnsureChildControls. Я что-то упустил? Если я создам повторитель и оставлю свой userctonrol в шаблоне элемента, он будет работать нормально. Могу ли я заставить это работать динамически?

Пользовательский элемент управления:

<%@ 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>

Пользовательский код управления:

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);
            }
        }
    }
}
5
задан Jeremy 7 October 2011 в 03:57
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: