2012-11-26 64 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控制添加。