代码之家  ›  专栏  ›  技术社区  ›  pbz

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

  •  2
  • pbz  · 技术社区  · 17 年前

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

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

    在同一页上:

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

    我想做的是,在MyControl中,更改NewParent的父对象,使其成为MyControl控件集合的一部分。当我尝试这样做时,从OnInit,我得到:

    在数据绑定、初始化、加载、预渲染或卸载阶段,无法修改控件集合。

    这是有道理的,但有办法解决这个问题吗?如果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位于树层次结构中的同一级别,在我的示例中这是正常的。

    3 回复  |  直到 17 年前
        1
  •  1
  •   TheVillageIdiot    17 年前

    你为什么不试着把它加进去 页面加载完成

    myc.Controls.Add(NewParent);
    
        2
  •  0
  •   Kobi    17 年前

    我无法复制它,但正如aman.tur所建议的,你尝试过其他活动吗?最重要的 CreateChildControls()

        3
  •  0
  •   zzzzBov    15 年前

    @Villageidiot的建议对我有效:

    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

    推荐文章