2012-11-26 35 views
0

我开发一个自定义服务器控件,以下是控制的我的ASPX页面上的标记,ASP.net Web服务器控件,孩子不是maintenaing状态

<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控制权。而且控制可以有任何类型的孩子。

在同一个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

您不需要在加载事件期间初始化控件时添加项目。注意:需要始终添加项目,而不仅仅是在GET期间页面未加载时。在发生加载事件时,状态已经初始化。请参阅`Control Execution Lifecycle'

+0

感谢您的回答肯,你说的DropDownList项目?如果是,那么我认为我们不应该每次都添加项目(GET/POST),那么ViewState的意义何在? – sallushan

0

OK我解决了它。

我们只需要调用控件初始化的EnsureChildControls()方法,这会导致子控件的ViewState中的/ etc前创建。事情被调用。

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    this.EnsureChildControls(); 
} 

我上面的代码在我NoteBook控制添加。