Tôi có một lớp (MyClass) đại diện cho một hệ thống phân cấp lồng nhau, vì vậy lớp này có thuộc tính là tập hợp MyClass. MyClass cũng có một thuộc tính tiêu đềTự động thêm điều khiển người dùng vào bộ lặp
Để hiển thị nó trên một trang web, tôi đã hy vọng tạo ra một điều khiển người dùng có bộ lặp. Trong mục mẫu, tôi sẽ có chữ để hiển thị thuộc tính tiêu đề và trên sự kiện ItemCreated của bộ lặp, tôi sẽ tạo một thể hiện mới của usercontrol và thêm nó vào mục hiện tại trong bộ lặp.
Vấn đề của tôi là khi sự kiện Page_Load trong bảng điều khiển người dùng kích hoạt, nếu điều khiển được thêm động, repORTty repMyClass repeater là null, ngay cả khi tôi gọi EnsureChildControls. Am i thiếu cái gì ở đây? Nếu tôi tạo ra một repeater và thả userctonrol của tôi trong mục mẫu nó hoạt động tốt. Tôi không thể làm điều này để làm việc năng động?
Bản quyền thuộc về:
<%@ 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>
User Control 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);
}
}
}
}
Bạn có thể chỉnh sửa điều này để giải thích và có thể làm sạch điều này. Tôi nghĩ có lẽ bạn đã có một nửa sửa đổi trong câu này mà không được hoàn thành? "Vấn đề của tôi là, khi sự kiện Page_Load đầu tiên cho các điều khiển được thêm động, repNyClass repeater poroperty là null" – chrismay