如何将控件移动到页面中动态添加的用户控件?

时间:2009-03-06 22:25:51

标签: c# asp.net dynamic-usercontrols

我有一个usercontrol,可以在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控件。

2 个答案:

答案 0 :(得分:1)

由于LoadControl会将加载控件的每个事件都捕获到当前事件,因此当时事件已经发生,因此无法在父事件的同时运行CreateChildControls。

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

答案 1 :(得分:0)

就“页面生命周期”而言,必须初始化控件并使其与其他控件保持同步。看一下Page.LoadControl方法,看看是否可以在之前创建你的控件。

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