[英]How can I move controls into a dynamically added usercontrol into page?
我有一个用户控件,可以在某些 web 控件的 CreateChildControls 方法上动态移动。 当将此控件用于如下页面时:
<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 控件。
由于 LoadControl 将加载控件的每个事件都赶上当前事件,因此不可能与父控件同时运行 CreateChildControls,因为此时事件已经发生。
在我的情况下,我无法动态添加我的 UserControl,所以我做了相反的事情来重现我想要的相同行为。 我初始化了所有控件,并删除了那些我不想要的 OnClick。 这会增加不必要的加载时间,但在我使用它的场景中是可以接受的。
就“页面生命周期”而言,必须使用控件的 rest 初始化控件并使其加速。 查看 Page.LoadControl 方法,看看是否可以更早地创建您的控件。
我们有时使用的方法涉及使用页面中的回发参数。 不要忘记您需要在每次回发时将控件重新添加到表单中,因为它不会为您创建
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.