【问题标题】:How can I move controls into a dynamically added usercontrol into page?如何将控件移动到页面中动态添加的用户控件中?
【发布时间】:2010-10-11 20:44:56
【问题描述】:

我有一个用户控件,可以在 CreateChildControls 方法上动态移动一些 Web 控件。 当将此控件用于类似以下的页面时:

<myControls:MyUserControl runat="server" ID="myUserControl" />

完美运行。

但如果我想将该 userControl 动态添加到如下页面中:

<asp:UpdatePanel runat="server">
    <ContentTemplate>
        <asp:PlaceHolder runat="server" ID="plhControls" />
    </ContentTemplate>
</asp:UpdatePanel>
<asp:Button runat="server" ID="btnAdd" OnClick="btnAdd_Click" />

.cs

protected void btnAdd_Click(object sender, EventArgs e)
{
    MyUserControl myUserControl =(MyUserControl)LoadControl("~/Controls/MyUserControl.ascx");
    myUserControl.ID = "test";
    plhControls.Controls.Add(myUserControl );
}

它在我的 CreateChildControls 中崩溃并出现错误:在 DataBind、Init、Load、PreRender 或 Unload 阶段无法修改控件集合。

确切的说是当我将 webControls 添加到我的 UserControl 中的占位符时:

plhContent.Controls.Add(myWebControl);

所以我不明白为什么在这种情况下,当我动态添加我的 UserControl 时,我无法在 CreateChildControls 事件中移动 Web 控件。

【问题讨论】:

    标签: c# asp.net dynamic-usercontrols


    【解决方案1】:

    由于 LoadControl 将加载控件的每个事件都赶上当前事件,因此不可能与父控件同时运行 CreateChildControls,因为此时事件已经发生。

    在我的情况下,我无法动态添加我的 UserControl,所以我做了相反的事情来重现我想要的相同行为。我初始化了所有控件,并删除了那些我不想要 OnClick 的控件。这会增加不必要的加载时间,但在我使用它的场景中是可以接受的。

    【讨论】:

      【解决方案2】:

      就“页面生命周期”而言,必须初始化控件并使其与其他控件同步。查看 Page.LoadControl 方法,看看是否可以更早地创建您的控件。

      我们有时使用的方法涉及使用页面的回发参数。不要忘记您需要在每次回发时将控件重新添加到表单中,因为它不会为您创建

      【讨论】:

      • 不幸的是,由于之前的控制移动,我无法更早地创建我的控制。因此我不能使用回传参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多