2009-06-02 63 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上进行更改。