ASP.NET动态重新分配控件树中的控件

时间:2009-06-02 04:16:13

标签: asp.net dynamic controls

假设我有一个看起来像这样的自定义控件

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

并且,在同一页面上:

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

我想要做的是,从MyControl,更改NewParent的父级,以便它将成为MyControl的Controls集合的一部分。当我尝试这样做时,从OnInit,我得到:

  

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

哪个有道理,但有办法解决这个问题吗?我很好,如果NewParent仍然是Page的孩子,只要从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放在树层次结构中的同一级别上,这在我的情况下是可以的。

3 个答案:

答案 0 :(得分:1)

为什么不尝试在 Page_LoadComplete

中添加它
myc.Controls.Add(NewParent);

答案 1 :(得分:0)

我无法重现它,但正如aman.tur建议的,你有没有尝试过另一个活动?覆盖CreateChildControls()似乎是适合它的地方。

答案 2 :(得分: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进行更改。