我正在开发一个自定义服务器控件,以下是我的ASPX页面上的控件标记,
<uc:NoteBook ID="nb1" runat="server">
<NotePages>
<uc:NotePage ID="p1" runat="server">
<asp:DropDownList ID="ddl1" runat="server"></asp:DropDownList>
</uc:NotePage>
</NotePages>
</uc:NoteBook>
请注意,此控件具有NotePages
属性,该属性实际上是NotePage
控件的集合。 NotePage
控制可以有任何类型的孩子。
在同一个aspx页面上,在Page_Load
事件处理程序中,我正在加载DropDownList
控件中的一些项目,
if (!this.IsPostBack)
{
this.ddl1.Items.Add(new ListItem("Class-1", "C1"));
this.ddl1.Items.Add(new ListItem("Class-2", "C2"));
this.ddl1.Items.Add(new ListItem("Class-3", "C3"));
}
问题:
现在问题出现在回发后,DropDownList
项目被清除。这清楚地表明我在这里缺少一些国家管理。
任何人都可以指导我如何处理它吗?
以下是控制代码。
public class NoteBook : CompositeControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public virtual List<NotePage> NotePages
{
get;
set;
}
public NoteBook()
{
this.NotePages = new List<NotePage>();
}
protected override void CreateChildControls()
{
foreach (var c in this.NotePages)
{
this.Controls.Add(c);
}
base.CreateChildControls();
}
}
[ParseChildren(false)]
public class NotePage : UserControl
{
}
感谢。
答案 0 :(得分:0)
在初始化控件时,您需要在加载事件期间添加项目。注意:需要始终添加项目,而不仅仅是在GET期间未加载页面时。到负载事件发生时,状态已初始化。请参阅“Control Execution Lifecycle”
答案 1 :(得分:0)
好的,我解决了。
我们只需要在控件初始化时调用EnsureChildControls()
方法,这会导致在ViewState / etc之前创建子控件。事情被召唤。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.EnsureChildControls();
}
我在NoteBook
控件中添加了上述代码。