0

我看到有很多类似的问题被问到。但就我而言,我不想在 Page_Load 或 OnInit 上添加用户控件。当单击页面上的按钮时,我想将用户控件动态添加到 PlaceHolder。我能够加载控件并且它显示得很好。但是该用户控件中的按钮不起作用。事件处理程序不会触发。更糟糕的是,单击用户控件中的按钮后,整个用户控件会消失。

这是我的用户控件,它有一个“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" />

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

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 和一个占位符。每次单击 AddButton 时都会(假定)创建一个 TestUC.ascx 实例。

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

<asp:Panel ID="DynamicUserControlPanel" runat="server">
        <asp:Button ID="AddButton" runat="server"Text="Add New User Control Dynamically" onclick="AddButton_Click" />
        <asp:Panel ID="PlaceHolder" runat="server"></asp:Panel>
</asp:Panel>

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

protected void AddButton_Click(object sender, EventArgs e)
    {
        UserControls.TestUC uc = LoadControl("~/UserControls/TestUC.ascx") as UserControls.TestUC;
        uc.ID = RandomStringGenerator.Generate(10);
        this.PlaceHolder.Controls.Add(uc);
    }

首先,当 AddButton 被点击(并一直被点击)时,只有一个 TestUC.ascx 实例被添加和显示。其次,用户控件中的 RefreshButton 不会触发。第三,单击 RefreshButton 时用户控件会消失。

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

非常感谢您提前。

4

1 回答 1

1

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

那么您的代码将无法正常工作。

您需要在每个帖子上重新创建控件。我有演示代码来完成这个:

笔记。在此示例中,当用户按下按钮并且所有事件都起作用时,用户控件将按需动态添加到页面中。

输出

在此处输入图像描述

背后的代码

    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();
        }
    }

ASPX

    <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" />
于 2012-08-10T07:08:20.770 回答