我需要动态地将UserControl添加到页面上的面板。 UserControl具有ID为ARepeater的中继器。我加载并在Page_Init上添加UC。我在UC的Init,Load和PreRender事件中检查了ARepeater的值,但ARepeater始终为空。
protected Page_Init(object sender, EventArgs e)
{
var list = (NameList)Page.LoadControl(typeof(NameList), new object[1] { (int)Type });
Panel1.Controls.Add(list);
}
NameList.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="NameList.ascx.cs" Inherits="MyCompant.Controls.BannersList" %>
<asp:Repeater ID="ARepeater" runat="server">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
我做错了什么?
答案 0 :(得分:1)
首先,您无需进入Page_Init
即可使用动态控件。 Page_Load
很好。但是为了填充中继器,您可以在UserControl中创建一个属性
public partial class WebUserControl1 : System.Web.UI.UserControl
{
public Repeater _ARepeater
{
get
{
return ARepeater;
}
set
{
ARepeater = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
然后您可以使用UserControl从页面访问它。
protected void Page_Load(object sender, EventArgs e)
{
var list = (WebUserControl1)LoadControl("~/WebUserControl1.ascx");
list.ID = "MyUserControl";
Panel1.Controls.Add(list);
list._ARepeater.DataSource = source;
list._ARepeater.DataBind();
}
或使用FindControl
var _ARepeater = (Repeater)Panel1.FindControl("MyUserControl").FindControl("ARepeater");
_ARepeater.DataSource = dt;
_ARepeater.DataBind();
答案 1 :(得分:0)
您可能不喜欢这个答案,但是Page.LoadControl
的重载允许指定控件的类型并添加构造函数参数,不会将ascx
绑定到后面的代码,并且所有关联的子控件最终将为null。
过去,我通过构造用户控件后添加另一种设置依赖项的方法来解决此问题,但这不是理想的解决方案。
那表示您没有做错任何事情。如果您使用Page.LoadControl("~/path/to/mycontrol.ascx")
,绑定将正常工作,但不会进行构造函数注入。
我相信问题在于,后备类实际上与前端页面没有关系,除非通过将其指定为后台代码类的页面指令来实现。没有什么可以使用与代码隐藏相同的类来停止多个不同的前端,因此,Type
的加载使确定要绑定的正确ascx
变得非常困难或完全不可能。>