Tengo una clase (MyClass) que representa una jerarquía anidada, por lo que la clase tiene una propiedad que es una colección de MyClass. MyClass también tiene una propiedad de títuloAgregando dinámicamente un control de usuario a un repetidor
Para mostrarlo en una página web, esperaba crear un control de usuario que tuviera un repetidor. En la plantilla del elemento, tendría literal para mostrar la propiedad del título, y en el evento ItemCreated del repetidor, crearía una nueva instancia del usercontrol y la agregaría al elemento actual en el repetidor.
Mi problema es que cuando se activa el evento Page_Load en el control de usuario, si el control se agregó dinámicamente, el repetidor repMyClass poroperty es nulo, incluso si llamo EnsureChildControls. ¿Me estoy perdiendo de algo? Si creo un repetidor y coloco mi userctonrol en la plantilla del artículo, funciona bien. ¿No puedo hacer que esto funcione dinámicamente?
controlusuario:
<%@ 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>
usuario Código de Control:
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);
}
}
}
}
Puedes editar esto para explicar y quizás limpiar esto. Creo que tal vez tuviste la mitad de una edición en esta oración que no se completó. "Mi problema es que cuando el evento Page_Load es el primero para los controles que se agregaron dinámicamente, el repetidor repNyClass poroperty es nulo" – chrismay