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

C# 如何创建和使用以编程方式将UpdatePanel添加到页面的自定义控件,c#,asp.net,updatepanel,custom-controls,C#,Asp.net,Updatepanel,Custom Controls,我有简单的web用户控件(我在web中找到的代码): 受保护的无效页面加载(对象发送方、事件参数e) { } 受保护的无效复选框1\u CheckedChanged(对象发送方,事件参数e) { 按钮1.可见=复选框1.选中; } 受保护的无效按钮1\u单击(对象发送者,事件参数e) { Label1.Text=DateTime.Now.ToString(); } 现在我想将此控件添加到我的页面(在OnLoadComplete事件中以编程方式): WebUserControl1 myCon

我有简单的web用户控件(我在web中找到的代码):


受保护的无效页面加载(对象发送方、事件参数e)
{
}
受保护的无效复选框1\u CheckedChanged(对象发送方,事件参数e)
{
按钮1.可见=复选框1.选中;
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
Label1.Text=DateTime.Now.ToString();
}
现在我想将此控件添加到我的页面(在OnLoadComplete事件中以编程方式):


WebUserControl1 myControl=(WebUserControl1)Page.LoadControl(“~/WebUserControl1.ascx”);
myControl.ID=“myControl”+某些名称;
parentControl.Controls.Add(myControl);

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

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

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


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

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


您可以单击按钮添加该控件,并将添加控件的计数保存在某些存储中,如
会话
。在
页面_Init
中,您需要检查该计数值,并重新创建之前添加的每个控件。

您可以单击按钮添加该控件,并将添加控件的计数保存在一些存储中,如
会话
。在
页面_Init
中,您需要检查该计数值并重新创建之前添加的每个控件。

在哪个页面的事件处理程序中重新创建该控件?是否在每次回发时都使用相同的
某个\u名称
控件的ID后缀值?@Yuriy我在页面的OnLoadComplete事件中重新创建控件。它具有相同的ID-“some_name”是已知的,并且对于添加到页面的每个WebUserControl1都是常量(为了简单起见,目前只有一个控件)。尝试将该控件的添加移动到
page_Init
我不确定是否可以-我想在特定的按钮单击后添加这些控件。我将尝试创建“独立”示例并检查它是否有效。在哪个页面的事件处理程序中重新创建该控件?是否在每次回发时都使用相同的
某个\u名称
控件的ID后缀值?@Yuriy我在页面的OnLoadComplete事件中重新创建控件。它具有相同的ID-“some_name”是已知的,并且对于添加到页面的每个WebUserControl1都是常量(为了简单起见,目前只有一个控件)。尝试将该控件的添加移动到
page_Init
我不确定是否可以-我想在特定的按钮单击后添加这些控件。我将尝试创建“独立”示例,并检查它是否有效。我创建了在OnPreInit或PreInit中添加控件的示例,在这两种情况下都有效。但是,如果我想在单击按钮后添加这些控件,该怎么办?您必须为要触发的事件重新添加控件,您可以在页面生命周期的后面删除它们。我创建了在OnPreInit或PreInit中添加控件的示例,并且在这两种情况下都有效。但是,如果我想在单击按钮后添加这些控件,该怎么办?您必须为要触发的事件重新添加控件,您可以稍后在页面生命周期中删除它们。
<%@ 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();
}
<%@ Reference Control="~/WebUserControl1.ascx" %>

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