2009-06-02 72 views
2

比方說,我有一個看起來像這樣ASP.NET動態重新控制在控制樹

<cc:MyControl runat="server" ID="myc" LinkControlID="NewParent" /> 

,並在同一頁上的自定義控制:

<asp:TextBox runat="server" ID="NewParent" /> 

我想do是,從MyControl中,更改NewParent的父項,以便它將成爲MyControl的Controls集合的一部分。當我嘗試這樣做時,從OnInit得到:

在DataBind,Init,Load,PreRender或Unload階段無法修改控件集合。

這是有道理的,但有沒有辦法解決這個問題?我很好,如果NewParent仍然是頁面的子項,只要從MyControl我可以重定向到MyControl的控制。

可以這樣做嗎?謝謝。

編輯

澄清這裏是MyControl的樣機:

public class MyControl : Panel 
{ 
    protected override void OnInit(System.EventArgs e) 
    { 
    base.OnInit(e); 
    if (!String.IsNullOrEmpty(LinkControlID)) 
    { 
     Control link = Parent.FindControl(LinkControlID); 
     if (link != null) 
     { 
     Controls.Add(link); 
     } 
    } 
    } 
    public string LinkControlID { get; set; } 
} 

這假定MyControl和LinkControlID被放置在樹層次結構中的同一級別,這是在我的情況OK 。

回答

1

你爲什麼不嘗試在Page_LoadComplete將它添加

myc.Controls.Add(NewParent); 
+0

我想你是在談論從頁面本身或兩個控件的父項這樣做。從頁面上做起。我可以將你寫的代碼放在頁面的OnInit中,它可以正常工作。問題是當一個控件試圖圍繞一個兄弟移動時。父級(在本例中爲頁面本身)似乎能夠做到這一點,但不能在同一樹級別上工作。 我可以做你的建議,但對我來說這將是更多的維修工作;我寧願控制本身照顧,再加上我需要調整在MyControl中應該添加/呈現的位置。謝謝。 – pbz 2009-06-02 16:49:40

0

我無法重現它,但作爲aman.tur建議,你嘗試過其他的活動?覆蓋CreateChildControls()似乎是正確的地方。

+0

我發佈了MyControl的樣子。將代碼從OnInit移動到CreateChildControls仍然給我那個錯誤。爲了澄清,我試圖將外部控件的父級更改爲MyControl的一部分,而不是創建屬於MyControl的新子控件。所以,別的東西創造了控制,我只是想移動它。 – pbz 2009-06-02 16:53:43

0

@ TheVillageIdiot的建議爲我工作:

protected void Page_Init(object sender, EventArgs e) 
{ 
    Page.LoadComplete += Page_LoadComplete; 
} 

private void Page_LoadComplete(object sender, EventArgs e) 
{ 
    if (InHeader) 
    { 
    Page.Header.Controls.Add(this); 
    } 
} 

你要知道,我有不同的要求,但我不認爲它應該是太大的問題,如果你可以從內部訪問新的父控件您MyControl。一般格式是在Page上添加一個事件偵聽器,以在LoadComplete上進行更改。