如何使用以编程方式添加到页面的UpdatePanel来创建和使用自定义控件

时间:2011-11-23 12:03:31

标签: c# asp.net updatepanel custom-controls

我有简单的网络用户控制(我在网络上找到的代码):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"
Inherits="ARP.DynamicsCRM2011.MagicWebForm.WebUserControl1" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="True" OnCheckedChanged="CheckBox1_CheckedChanged"
        Text="Checkbox" />
    <asp:Button ID="Button1" runat="server" Text="Button" Visible="False" OnClick="Button1_Click" />
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>

protected void Page_Load(object sender, EventArgs e)
{

}

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
    Button1.Visible = CheckBox1.Checked;
}

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = DateTime.Now.ToString();
}

现在我想将此控件添加到我的页面(以编程方式在OnLoadComplete事件中):

<%@ Reference Control="~/WebUserControl1.ascx" %>

WebUserControl1 myControl = (WebUserControl1)Page.LoadControl("~/WebUserControl1.ascx");
myControl.ID = "myControl_" + some_name;
parentControl.Controls.Add(myControl);

当然我在页面上有SriptManager,我的控件添加正确。我知道每次加载页面时都必须重新创建以编程方式添加的控件。不幸的是,这导致创建新控件,因此检查复选框不起作用 - 在检查后,再次触发OnLoadComplete(页面)并创建新控件。如果我省略,则不显示任何内容。所以问题是 - 如何做到这一点?

2 个答案:

答案 0 :(得分:1)

应该将动态控件重新添加到控制树OnPreInit,请参阅文档:

PreInit - 创建或重新创建动态控件。

ASP.NET Page Life Cycle Overview

答案 1 :(得分:0)

您可以在按钮点击时添加该控件,并在Session等存储空间中保存已添加控件的数量。在Page_Init中您需要检查该计数值并重新创建之前添加的每个控件。