【问题标题】:ASP.NET dynamically reassign controls in the control treeASP.NET 动态地重新分配控件树中的控件
【发布时间】:2010-10-30 14:06:05
【问题描述】:

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

<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 在树层次结构中位于同一级别,这在我的情况下是可以的。

【问题讨论】:

    标签: asp.net dynamic controls


    【解决方案1】:

    你为什么不尝试将它添加到 Page_LoadComplete

    myc.Controls.Add(NewParent);
    

    【讨论】:

    • 我认为您是在谈论从页面本身或两个控件的父级执行此操作。从页面执行此操作。我可以将您编写的代码放在页面的 OnInit 中,它会正常工作。问题是当控件试图在同级周围移动时。父级(在这种情况下是页面本身)似乎能够做到这一点,但不能跨同一个树级别工作。我可以按照您的建议做,但这对我来说将是更多的维护工作;我宁愿控件本身负责这一点,而且我需要调整 MyControl 中应该添加/呈现的确切位置。谢谢。
    【解决方案2】:

    我无法重现它,但正如 aman.tur 建议的那样,您尝试过其他活动吗?覆盖 CreateChildControls() 似乎是合适的地方。

    【讨论】:

    • 我发布了 MyControl 的样例。将代码从 OnInit 移动到 CreateChildControls 仍然会给我这个错误。为了澄清,我试图将外部控件的父控件更改为 MyControl 的一部分,而不是创建一个属于 MyControl 的新子控件。所以,其他东西创建了控件,我只想移动它。
    【解决方案3】:

    @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进行修改。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多