我看到有很多类似的问题被问到。但就我而言,我不希望在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时,用户控件将消失。
根据按钮点击动态添加用户控制的想法是否可行?有人可以提供一个简单的例子来实现这个目标吗?
非常感谢你。
答案 0 :(得分: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();
}
}
<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" />