【问题标题】:error when adding a control to a user control将控件添加到用户控件时出错
【发布时间】:2011-05-01 10:07:23
【问题描述】:

我正在尝试在用户控件中添加控件:

        LinkButton l = new LinkButton();
        l.Text = "Test";
        l.OnClientClick = "TestClick";
        l.ID = "TestID";
        l.Page = Page;
        Page.Controls.Add(l);

页面加载时出现此错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

[InvalidOperationException:集合已修改;枚举操作可能无法执行。] System.Web.UI.ControlCollectionEnumerator.MoveNext() +8677726 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection 孩子)+217 System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 System.Web.UI.Page.Render(HtmlTextWriter 作家)+29 System.Web.UI.Control.RenderControlInternal(HtmlTextWriter 编写器,ControlAdapter 适配器)+27 System.Web.UI.Control.RenderControl(HtmlTextWriter 编写器,ControlAdapter 适配器)+100 System.Web.UI.Control.RenderControl(HtmlTextWriter writer)+25 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060"

当我在自定义 Web 用户控件中时,我是否根本不允许通过代码隐藏向页面添加控件?如果我不添加此控件,则不会发生错误。

【问题讨论】:

    标签: asp.net user-controls code-behind


    【解决方案1】:

    这是因为您将其添加到 PAGE 中的控件而不是您的用户控件中...

    当页面初始化其控件时,将从页面调用您的代码,显然此时您将无法向页面的现有(部分初始化)控件树添加其他控件...

    此外,仅向用户控件添加控件总是比使用页面中的控件更为谨慎,因为您不知道哪个页面最终可能会使用您的控件。

    试试这个:

     this.Controls.Add(l)
    

    【讨论】:

      【解决方案2】:

      您需要确保在page's life cyclePreInit 阶段添加控件。基本上,一旦引发Init 事件,您就不应修改页面控件集合中的控件。

      【讨论】:

        【解决方案3】:

        据我所知,如果您想动态添加控件,则需要使用 PlaceHolder 控件

        More info here

        【讨论】:

        • 占位符将有助于确定控件的呈现位置。但是,在页面生命周期的后期添加控件并不安全。
        猜你喜欢
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多