Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态添加的用户控件事件未触发_C#_Asp.net - Fatal编程技术网

C# 动态添加的用户控件事件未触发

C# 动态添加的用户控件事件未触发,c#,asp.net,C#,Asp.net,我看到有很多类似的问题被问到。但在我的例子中,我不想在pageu加载或OnInit上添加用户控件。我想在单击页面上的按钮时动态地将用户控件添加到占位符。我能够加载控件,它显示得很好。但是用户控件中的按钮不起作用。事件处理程序不会启动。更糟糕的是,单击用户控件中的按钮后,整个用户控件将消失 这是我的用户控件,它有一个“RefreshButton”,它的事件处理程序只是用DateTime.Now更新MessageLabel -------------------TestUC.ascx--------

我看到有很多类似的问题被问到。但在我的例子中,我不想在pageu加载或OnInit上添加用户控件。我想在单击页面上的按钮时动态地将用户控件添加到占位符。我能够加载控件,它显示得很好。但是用户控件中的按钮不起作用。事件处理程序不会启动。更糟糕的是,单击用户控件中的按钮后,整个用户控件将消失

这是我的用户控件,它有一个“RefreshButton”,它的事件处理程序只是用DateTime.Now更新MessageLabel

-------------------TestUC.ascx------------------------------

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestUC.ascx.cs" Inherits="PASS.Web.UserControls.TestUC" %>
TestUC: 
<asp:Label ID="MessageLabel" runat="server"></asp:Label>
<asp:Button ID="RefreshButton" runat="server" Text="Refresh" onclick="RefreshButton_Click" />
protected void Page_Load(object sender, EventArgs e)
{ }

protected void RefreshButton_Click(object sender, EventArgs e)
{
    this.MessageLabel.Text = " Server Time: " + DateTime.Now.ToString();
}
父页面有一个AddButton和一个placeholder。每次单击AddButton时都会创建TestUC.ascx的一个实例

------------Test.aspx----------------

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestUC.ascx.cs" Inherits="PASS.Web.UserControls.TestUC" %>
TestUC: 
<asp:Label ID="MessageLabel" runat="server"></asp:Label>
<asp:Button ID="RefreshButton" runat="server" Text="Refresh" onclick="RefreshButton_Click" />
protected void Page_Load(object sender, EventArgs e)
{ }

protected void RefreshButton_Click(object sender, EventArgs e)
{
    this.MessageLabel.Text = " Server Time: " + DateTime.Now.ToString();
}
首先,单击AddButton(并一直单击)时,只添加并显示TestUC.ascx的一个实例。其次,用户控件中的刷新按钮不会启动。第三,当单击刷新按钮时,用户控件将消失

在点击按钮时动态添加用户控件的想法是否可行?有人能为实现这一目标提供一个简单的例子吗

事先非常感谢

我不想在Page_Load或OnInit上添加用户控件

那么你的代码就不起作用了

您需要在每个帖子上重新创建控件。我有实现这一点的演示代码:

注意。在本例中,当用户按下按钮且所有事件都工作时,用户控件将按需动态添加到页面

输出

代码隐藏
受保护的无效页\u Init(对象发送方,事件参数e)
{
for(int i=0;i
ASPX


感谢您的评论。我发现下面的帖子非常接近我的问题/场景。答案建议使用viewstate跟踪需要加载的用户控件,并在每次回发时重新加载它们。
    protected void Page_Init(object sender, EventArgs e)
    {
        for (int i = 0; i < this.DynamicControlsCount; i++)
        {
            var c = this.LoadControl("~/AddressControl.ascx");

            this.addresses.Controls.Add(c);
        }
    }

    protected void addAddress_Click(object sender, EventArgs e)
    {
        this.DynamicControlsCount++;
        var c = this.LoadControl("~/AddressControl.ascx");

        this.addresses.Controls.Add(c);
    }

    protected int DynamicControlsCount
    {
        get
        {
            if (string.IsNullOrWhiteSpace(this.Request.Form["numberOfControls"]))
            {
                return 0;
            }
            return int.Parse(this.Request.Form["numberOfControls"]);
        }
        set
        {
            int temp = int.Parse(this.numberOfControls.Value);
            temp++;
            this.numberOfControls.Value = temp.ToString();
        }
    }
    <asp:PlaceHolder runat="server" ID="addresses" /><br />
    <asp:HiddenField runat="server" ID="numberOfControls" Value="0" />
    <asp:Button Text="Add Address" runat="server" ID="addAddress" OnClick="addAddress_Click" />